LeetCode——041
2016-04-17 10:59
295 查看
/*
41. First Missing Positive My Submissions QuestionEditorial Solution
Total Accepted: 62613 Total Submissions: 263261 Difficulty: Hard
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.
Subscribe to see which companies asked this question
*/
/*
解题思路:
1.使用set对数据进行统计,并统计出一个最大值maxval
2.从1~maxval进行寻找,如果找不到就直接返回,如果都找到了,那么返回maxval+1
其实这样做并不符合要求,set在查找的过程中复杂度应该是高于n的
*/
class Solution { public: int firstMissingPositive(vector<int>& nums) { //使用set if(nums.size()==0)return 1; int maxval=0; set<int> _s; for(int i=0;i<nums.size();i++){ _s.insert(nums[i]); maxval=max(maxval,nums[i]); } for(int i=1;i<=maxval;i++){ if(_s.find(i)==_s.end())return i; } return maxval+1; } };
/*
但是上面的解法不是O(1)的时间复杂度,所以我们需要另想一种解法,既然不能建立新的数组,那么我们只能覆盖原有数组,我们的思路是把1放在数组第一个位置A[0],2放在第二个位置A[1],即需要把A[i]放在A[A[i] - 1]上,那么我们遍历整个数组,如果A[i] != i + 1, 而A[i]为整数且不大于n,另外A[i]不等于A[A[i] - 1]的话,我们将两者位置调换,如果不满足上述条件直接跳过,最后我们再遍历一遍数组,如果对应位置上的数不正确则返回正确的数,代码如下:
*/
class Solution { public: int firstMissingPositive(vector<int> A) { int i = 0; int n=A.size(); while (i < n) { if (A[i] != i + 1 && A[i] > 0 && A[i] <= n && A[i] != A[A[i] - 1]) { swap(A[i], A[A[i] - 1]); } else { ++ i; } } for (i = 0; i < n; ++i) { if (A[i] != i + 1) return i + 1; } return n + 1; } };
相关文章推荐
- c/c++比较灵活的方法:回调函数和函数指针
- C# 汉字转拼音 使用微软的Visual Studio International Pack 类库提取汉字拼音首字母
- 高逼格的画图:VIM原来可以这样玩
- hive UDF函数
- 今日BBC
- leetcode——59——Spiral Matrix II
- [HDU 5667] Sequence (矩阵快速幂+费马小定理)
- 数据持久化-Plist
- OpenCV中的CV_EXPORT是什么意思
- 算法复习之选择排序
- 读者写者问题
- android图片的缓存--节约内存提高程序效率
- 主机开启后,显示器显示NO SIGNAL,无信号
- nefu500网购【二分+网络流】
- 算法复习之快排
- 24. Swap Nodes in Pairs
- 显示联系人列表2 分类标题栏
- 浅谈管道模型(Pipeline)
- mac 下安装 mongodb
- Poco 之cppunit解读