个人思路总结:
本题要求时间复杂度为O(n),且只能使用常数级别的空间。因此不能先对数组进行排序。
遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。
代码如下:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
int tmp = 0;
for(int i=0;i<len;i++)
{
while(nums[i]!=i+1)
{
if(nums[i]>0 && nums[i]<=len && nums[i]!=nums[nums[i]-1])
{
tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
}
else
break;
}
}
for(int i=0;i<len;i++)
{
if(nums[i]!=i+1)
return i+1;
}
return len+1;
}
};
博客总结了一个数组查找问题的个人思路。题目要求时间复杂度为O(n)且用常数级空间,不能先排序。思路是遍历数组将符合条件的值放到对应位置,再遍历查下标与值是否对应,不对应则下标为答案,否则答案是数组长度加1,还给出了代码。
7276

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



