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 }