* 41. First Missing Positive

Posted king-lps

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了* 41. First Missing Positive相关的知识,希望对你有一定的参考价值。

1. 原始题目

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

 

2. 思路---交换法

第一遍遍历:对于数组每个>=1的元素(正整数)且大小小于数组长度的元素都要交换位置以确保其在数组中的位置正确。

第二遍遍历:如果当前元素的位置不正确则返回该元素大小+1,否则遍历结束后返回数组长度+1。

具体过程参考博客

 

nums = [ 3 4 -1 1 8 ]

 

nums [ 0 ] 等于 3,把 3 放到第 3 个位置,并且把之前第 3 个位置的 -1 放回来,更新 nums [ -1, 4, 3, 1, 8 ]。

 

然后继续判断(循环判断)交换回来的数字,nums [ 0 ] 等于 -1,不是正数,忽略。

 

nums [ 1 ] 等于 4,把 4 放到第 4 个位置,并且把之前第 4个位置的 1 放回来,更新 nums [ -1, 1, 3, 4, 8 ]。

 

然后继续判断交换回来的数字,nums [ 1 ] 等于 1,把 1 放到第 1 个位置,并且把之前第 1 个位置的 -1 放回来,更新 nums [ 1, -1, 3, 4, 8 ]。

 

然后继续判断交换回来的数字,nums [ 1 ] 等于 -1,不是正数,忽略。

 

nums [ 2 ] 等于 3,刚好在第 3 个位置,不用管。

 

nums [ 3 ] 等于 4,刚好在第 4 个位置,不用管。

 

nums [ 4 ] 等于 8,我们的 nums 数组只能存 1 到 5,所以同样忽略。

 

最后,我们只需要遍历 nums 数组,遇到第一次 nums [ i ] != i + 1,就说明缺失了 i + 1。因为我们的 nums 数组每个位置都存着比下标大 1 的数。

 

代码:

 1 class Solution {
 2 public:
 3     int firstMissingPositive(vector<int>& nums) {
 4         for (int i = 0; i<nums.size(); i++){
 5             while ((nums[i] >0) && (nums[i] < nums.size() && (nums[i] != nums[nums[i] - 1]))){  # 注意while
 6                 swap(nums, i, nums[i] - 1);                       # 循环判断处理交换后的位置
 7             }
 8             
 9         }
10         for (int i = 0; i<nums.size(); i++)
11             if (nums[i] != i+1)
12                 return i+1;
13         return nums.size()+1;
14     }
15 
16     void swap(vector<int>&nums, int i, int j){
17         int temp = nums[i];
18         nums[i] = nums[j];
19         nums[j] = temp;
20     }
21 };

 

 

以上是关于* 41. First Missing Positive的主要内容,如果未能解决你的问题,请参考以下文章

41. First Missing Positive

LeetCode 41. First Missing Positive

java 41. First Missing Positive(#)。java

java 41. First Missing Positive(#)。java

java 41. First Missing Positive(#)。java

java 41. First Missing Positive(#)。java