leetcode 0041
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
参考
一开始想排序来着,但是时间复杂度要求是O(n)就不可能用排序了,然后就不知所措了。
看了B站up主:liweiwei1419的讲解,讲的很好,链接如下:
思路
把每个数放到该有的位置上,比如把3放到nums[2],把5放到nums[4],即将nums[i]与nums[nums[i]-1]进行交换。交换的条件是nums[i]必须在[1,len]之间且nums[nums[i]-1]上的数不为nums[i](一样的就没必要交换了)。
交换之后仍需判断nums[i]能否继续交换。
由于缺失的最小正整数一定是在[1,len+1]之间,我们只需在遍历一次数组,第一个被发现不符合nums[i] == i + 1的即为结果,若全部符合,则返回len+1。
每次交换必有一个数到达了正确位置,所以交换次数不可能超过len次,时间复杂度是O(n),秒啊!
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
int temp = 0;
for (int i = 0; i < len; i++) {
while (nums[i] > 0 && nums[i] < len + 1 && nums[nums[i] - 1] != nums[i]) {
temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
for (int i = 0; i < len; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return len + 1;
}
}