题目描述
题目链接41. 缺失的第一个正数
题解
归位法,
- 我们把所有的
1 <= nums[i] <= nums.length
的数字进行归位。比如当nums[i] == 1的时候,我们把它放在第0个位置,当nums[i] == 2的时候,我们把它放在第1个位置… - 举个例子[3,4,-1,1],归位之后为[1,4,3,-1],其中数字1和3,分别都归位到了第0个位置和第2个位置。
- 然后遍历归位后的数组,当
nums[i] != i + 1
的时候,i + 1
就是缺失的第一个整数 - 如果遍历结束,则返回
nums.length + 1
详见代码注释
class Solution {
public int firstMissingPositive(int[] nums) {
for (int i = 0; i < nums.length; i++){
//如果nums[i]在1到nums.length之间,就进行归位
//仔细理解nums[nums[i] - 1] != nums[i]
//比如现在nums[i]==5,那么我们就要看下标为4(nums[i] - 1)的位置,看下标为4的位置上放的是不是5(nums[i]),如果下标为4的地方存放的是其他的数字,就进行交换,把5归位
while (nums[i] > 0 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]){
swap(nums, i, nums[i] - 1);
}
}
//从头遍历归位后的数组,如果当前存储的数字并不是 下标 + 1,那么缺失的就是这个数字
for (int i = 0; i < nums.length; i++){
if (nums[i] != i + 1) return i + 1;
}
//1到nums.length都出现了,返回nums.length + 1
return nums.length + 1;
}
public void swap(int[] nums, int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}