41. 缺失的第一个正数

 1 // 给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
 2 //     示例 1 :
 3 //     输入 : [ 1, 2, 0 ] 输出 : 3 示例 2 :
 4 //     输入 : [ 3, 4, -1, 1 ] 输出 : 2 示例 3 :
 5 //     输入 : [ 7, 8, 9, 11, 12 ] 输出 : 1
 6 // leetcode-cn.com/problems/first-missing-positive
 7 
 8 #include <iostream>
 9 #include <vector>
10 
11 class Solution {
12  public:
13   int firstMissingPositive(std::vector<int>& nums) { return method1(nums); }
14 
15   // 思路一:
16   // 新建一个tmp数组,长度为nums.size(),默认值为0
17   // 遍历nums数组,对每个数组放在其对应的位置,如果超出了,则丢弃
18   // 遍历tmp数组,找到第一个为0的,则说明是答案
19   int method1(std::vector<int>& nums) {
20     std::vector<int> tmp(nums.size(), 0);
21     for (int i = 0; i < nums.size(); ++i) {
22       if (nums[i] > 0 && nums[i] <= nums.size()) {
23         tmp[nums[i] - 1] = nums[i];
24       }
25     }
26 
27     for (int i = 0; i < tmp.size(); ++i) {
28       if (tmp[i] == 0) {
29         return i + 1;
30       }
31     }
32 
33     return nums.size() + 1;
34   }
35 
36   // 思路二:
37   // 对思路一进行改进
38   // 使用in-place方案
39   // 对每个nums中的元素进行如下措施保证“有序”
40   // 对nums[i],将nums[i]放在nums[nims[i] - 1]上,
41   // 知道nums[i]越界,或者nums[nums[i] - 1]的数是正确的
42   int method2(std::vector<int>& nums) {
43     for (int i = 0; i < nums.size(); ++i) {
44       while (nums[i] > 0 && nums[i] <= nums.size() &&
45              nums[i] != nums[nums[i] - 1]) {
46         std::swap(nums[i], nums[nums[i] - 1]);
47       }
48     }
49 
50     for (int i = 0; i < nums.size(); ++i) {
51       if (nums[i] != i + 1) {
52         return i + 1;
53       }
54     }
55 
56     return nums.size() + 1;
57   }
58 };
59 
60 int main(int argc, char* argv[]) {
61   std::vector<int> vec({4, 2, 1, 3});
62   Solution so;
63   std::cout << so.method2(vec) << std::endl;
64   return 0;
65 }

 

posted on 2019-09-22 21:26  bug睡的略爽  阅读(127)  评论(0编辑  收藏  举报

导航