题目大意

解题思路

  • 排序nlogn,从1开始找,idx 第一个正数 for(i=idx)nums[i-1] == i ?
  • O(N),但是空间也是O(N),用桶标记,其实类似桶排序。

我思考到了原地修改打标记,但是忘了原本就是负数的怎么打标记?
题解说,由于nums.length的限制,所以我们可以将负数+x将其变为不影响结果的正数。首先负数本身就对结果没有影响。

答案一定是[1.nums.length()]。

Code

  1. class Solution {
  2. public:
  3. int firstMissingPositive(vector<int>& nums) {
  4. for (int i=0;i<nums.size();i++)
  5. if (nums[i] <= 0) nums[i] = 5e5+5;
  6. for (int i=0;i<nums.size();i++) {
  7. int t = abs(nums[i]);
  8. if (t <= nums.size()) {
  9. if (nums[t-1] > 0) //忘记了 重复元素
  10. nums[t-1] *= -1;
  11. }
  12. }
  13. int ans = nums.size()+1;
  14. for (int i=0;i<nums.size();i++) {
  15. if (nums[i] > 0) {
  16. ans = i+1;
  17. break;
  18. }
  19. }
  20. return ans;
  21. }
  22. };