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; } };
学到的内容
常量空间想到原位排序内容与下标对应建立索引
相关文章推荐
- lintcode-easy-Longest Words
- 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库
- mac osx terminal 报错:nohup: can't detach from console: Inappropriate ioctl for device
- GDOI2.25模拟总结
- iOS_SN_Socket - AsyncSocket
- LeetCode 40 Combination Sum II--In Java
- AspNet5.ENU.RC1安装错误:0x80072f0d - 未指定的错误
- <<精通iOS开发>>第14章例子代码彻底清除警告
- <<精通iOS开发>>第14章例子代码彻底清除警告
- <<精通iOS开发>>第14章例子代码彻底清除警告
- Beginner's Guide For How To Start A Startup
- 【Android】13.1 用Android自带的API访问SQLite数据库
- expect 打开文件
- BZOJ 3728: PA2014Final Zarowki|贪心
- 在Windows环境中开始Docker的学习和体验
- lintcode-easy-Longest Increasing Continuous Subsequence
- 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面
- GDOI模拟 2.26
- 齊次座標
- PostgreSQL avg()函数