您的位置:首页 > 其它

LeetCode 41. First Missing Positive

2016-02-26 07:43 387 查看

Qustion:


Given an unsorted integer array, find the first missing positive integer.



For example,

Given [1,2,0] return 3,

and [3,4,-1,1] return 2.



Your algorithm should run in O(n) time and uses constant space.



题解:数组是按照从1开始的正整数算,并非寻找一组连续数字中缺失的正整数。即给出 60,61,62,64 四个数,输出结果是1并非63。

关键点:将数组下标与数值内容建立对应关系

思路:单指针从头开始,将当前下标中存放的值交换到与值相对应的下标的位置中去。例如:[3,4,-1,1] 作为输入,第一步操作为将 3 与 -1 交换使得3到第三个位置,也就是下标为 2 的位置。以此类推。如果交换后当前下标的数值仍然不对应当前下标,则保持指针不动继续进行交换,直到当前下标为对应的元素或者当前下标的元素为超范围的元素(小于等于0或者大于数组下标的数)才向前移动。

class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
//保存数组长度,并减少size()函数的调用次数
int size = nums.size();
for (int i = 0; i < size; i++) {
//仅当保存的数值在合理范畴才交换
if (nums[i] > 0 && nums[i] < size) {
//保存待交换的目标下标,防止后续的数组越界问题
int temp = nums[i] - 1;
swap(nums[i], nums[temp]);
//若交换后当前下标仍不对当前内容则保持指针不动
//(nums[temp]!=nums[i] 是为了防止出现重复数字而产生死循环
if ((nums[i] != i + 1) && (nums[temp] != nums[i]))
i--;
}
}

//循环找到第一个下标不对应的元素即为缺失的第一个整数
for (int i = 0; i < size; i++) {
if (nums[i] != i + 1)
return i + 1;
}
return size + 1;
}
};

学到的内容

常量空间想到原位排序

内容与下标对应建立索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: