输入:一个未排序整数数组 nums
要求:找出其中 没有出现的最小正整数。
-
时间复杂度:O(n)
-
空间复杂度:O(1)(可以修改原数组)
输出:一个整数
思路:这一道困难题,感觉真有点脑筋急转弯的风味,核心在于要明白答案只会出现在[1,n+1]中,就是无论怎么折腾,最终的答案一定会出现在这个范围内,想明白这一点,做起来就很方便了。
利用原数组本身作为哈希表,把数字放到它该去的位置。即值为 n 的数字,应该放在下标 n-1 的位置。
如果所有 1~n 都在正确的位置上,那么答案就是 n+1。
如果一堆数字都不在正确的位置上,那也没关系,我们找到第一个不在的,它就是答案。
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
//负数和0的回答是 1
//1的回答是2
//其余整数n的回答是 n+1
int left = nums.size();
int right = 1;
if (nums.size() == 1) {
if (nums[0] == 1) {
return 2;
}
return 1;
}
for (int i = 0; i < nums.size(); i++) {
if (nums[i] >= 1 && nums[i] <= left && nums[i] != nums[nums[i] - 1]) {
swap(nums[i], nums[nums[i] - 1]);
i--;
}
}
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return left + 1;
}
};
1106

被折叠的 条评论
为什么被折叠?



