交换当前元素, 直到当前元素不是范围内元素或者成功替换了, edge case是重复元素, 会导致无限循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution {
public int firstMissingPositive(int[] nums) { int len = nums.length; for (int i = 0; i < len; i++) { while (nums[i] >= 1 && nums[i] <= len && nums[i]-1 != i && nums[nums[i]-1] != nums[i]) { swap(nums, i, nums[i]-1); } } for (int i = 0; i < len; i++) { if (nums[i] != i+1) { return i+1; } } return len+1; }
private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
|