LintCode 丢失的第一个正整数
2015-10-04 16:46
302 查看
丢失的第一个正整数
给出一个无序的正数数组,找出其中没有出现的最小正整数。
样例
如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2
挑战
只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。
Solution:
方法一:一种最直接的方法就是对数组进行排序然后再查找.
方法二:转自LeetCode discuss
idea:通过交换元素的位置是的在正确的位置存放正确的数字(例如给定一个数字3那么他应该在第三个位置,下标为2),当存在重复的数字时将数字移到数组的后面:
例如:给出[3, 4, -1, 1]
对于给定具有重复数字的也是一样
给出一个无序的正数数组,找出其中没有出现的最小正整数。
样例
如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2
挑战
只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。
Solution:
方法一:一种最直接的方法就是对数组进行排序然后再查找.
class Solution { public: /** * @param A: a vector of integers * @return: an integer */ int firstMissingPositive(vector<int> A) { // write your code here sort(A.begin(), A.end()); int data = 0; for (int i = 0; i < A.size(); ++i) { if (A[i]>0 && A[i]-data > 1) return data +1; else if (A[i] > 0) data = A[i]; } return data + 1; } };
方法二:转自LeetCode discuss
idea:通过交换元素的位置是的在正确的位置存放正确的数字(例如给定一个数字3那么他应该在第三个位置,下标为2),当存在重复的数字时将数字移到数组的后面:
例如:给出[3, 4, -1, 1]
对于给定具有重复数字的也是一样
class Solution { public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); for (int i = 0; i < n; i++) while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) swap(nums[i], nums[nums[i] - 1]); for (int i = 0; i < n; i++) if (nums[i] != i + 1) return i + 1; return n + 1; } };
相关文章推荐
- 小圆大圆转圈问题
- SQL Server与Oracle的一些区别
- Java——Thread/Runnable实现多线程
- win10预览版10558怎么样 win10预览版10558上手体验视频
- Java——Thread/Runnable实现多线程
- XML数据解析-SAX和DOM
- Shell基础-Bash变量-用户自定义变量
- Python爬虫的一些总结
- 零碎知识点(未分类)
- HTTPS协议简介
- linux c 获取硬盘序列号
- 杭电acm1302
- Java-递归算法思想
- 15_10_4
- 连接线程与等待一个对象
- Session的用法(代码解析)
- 利用Collections类操作链表(排序,反转等)
- IOS开发笔记 ——@dynamic 和 @synthesize 和区别
- Cntlm安装和配置体验
- Swift过程控制和功能