* 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 };