leetcode41-缺失的第一个正数
题目:给定一个未排序的整数数组,找出其中没有出现的最小的正整数。要求时间复杂度O(n)、空间复杂度O(1)
分析:
首先想到用个vis数组,数组开多大呢,需要根据数的范围(其实只需要开n的大小,因为我们不需要关心小于1和大于n的数)
但是这样需要额外的空间,不符合题意。于是想着能不能将原数组当作vis数组用,用取反(负数)作为“出现过”的标记。
整理一下:
1. 遍历一篇看是否有1,没有直接return 1
2. 将在[1, n]之外的置为1
3. 遍历,将每个值(取绝对值,因为可以被取负了)作为索引的位置取反(如果之前是正数的话)
4. 遍历一遍,第一个非负数的索引即答案。
class Solution { public: int firstMissingPositive(vector<int>& a) { int n = a.size(); int flag = false; for(int i = 0;i < n;i++) if(a[i] == 1) { flag = true; break; } if(!flag) return 1; for(int i = 0;i < n;i++) // 小于1,大于n的都改成1 { if(a[i] <= 0) a[i] = 1; if(a[i] > n) a[i] = 1; } for(int i = 0;i < n;i++) { int index = a[i]-1; if(a[i] < 0) index = -a[i]-1; if(a[index] > 0) a[index] = - a[index]; } int ans = n+1; for(int i = 0;i < n;i++) if(a[i] > 0) { ans = i+1; break; } return ans; } };
个性签名:时间会解决一切