题目描述(Leetcode每日一题)
基本思路
1.此题如果没有空间限制可以使用普通哈希表功能记录
2.此题如果没有时间限制可以使用二分查找把时间控制在nlonn
但是这道题全有
于是 今天学到一个别人自创的算法名字(也不知道是否权威)
原地哈希
因为哈希表其实也是数组,而当我们的输入数据的载体也是数组时,可以自行规定index和数据的关系
对于这道题的关键·
在于规定nums[nums[i]-1]=nums[i],也就是规定
下标为i的数组放i+1的数
怎么实现
因为没有额外的o(n)的辅助空间,我们能想到的只有swap
swap(nums[nums[i]-1],nums[i]);
特殊nums[nums[i]-1]==nums[i]会使得代码死循环,要特殊处理
详细代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
for(int i=0;i<len;++i)
{
while(nums[i]>0&&nums[i]<=len&&nums[nums[i]-1]!=nums[i])//可能交换完以后新的数同样需要交换
{
swap(nums[nums[i]-1],nums[i]);
}
}
for(int i=0;i<len;++i)
{
if(nums[i]!=i+1)
return i+1;
}
return len+1;
}
};
提交oj(++i比i++真的要快很多)
最后一个是i++,前面二个是++i