// 1. 负数或者是0:比如数组[-1, 2],-1对不上,但是也不动
// 2. 超出了数组长度:比如数组[7, 8],两个数都超出了数组长度,保持不动
// 3. 要交换的位上的数是正确归位的:比如数组[3, 2, 3],第一个3本来应该与第三位的数(也就是3)交换,但是显然3这个数已经正确归位了,虽然在不正确的位上也有他,保持不动。
// 以上三条,其实依然保证了数组第一个没被正确归位的位所应该归位的数是丢失的第一个正整数(特别地,如果数组所有位都合适,比如[1, 2, 3],那么返回的是4)。也就是说,这里的bucket_sort函数其实并没有真正意义上实现排序,而是对数组每一位“尽可能”寻找对应的数。例如,对[3, 4, -1, 1],执行bucket_sort后变为[1, -1, 3, 4];[1, 1, 2]执行bucket_sort后变为[1, 2, 1]。
static int x=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++){
// 对应着上面的三条规则
while(nums[i] > 0 && nums[i] - 1 < nums.size() && nums[nums[i] - 1] != nums[i])
swap(nums[nums[i] - 1], nums[i]);
}
// 最后扫描一遍,第一个数与坐标不同的就为丢失的第一个整数
for (int i = 0; i < nums.size(); i++){
if (i != nums[i] - 1)
return i + 1;
}
return nums.size() + 1;
}
};
LetCode 41. 缺失的第一个正数
最新推荐文章于 2024-04-20 20:18:23 发布