1 #include "000库函数.h"
2
3
4 //先排序,然后找值
5 //自己的解法 12ms
6 //class Solution {
7 //public:
8 // int firstMissingPositive(vector<int>& nums) {
9 // sort(nums.rbegin(),nums.rend());//对数组进行逆序排序
10 // for (int i = nums.size() - 1; i >= 0; --i)
11 // if (nums[i] < 1)nums.pop_back();//将小于1的数删除
12 // if (nums.size() == 0 || nums[nums.size()-1] > 1)return 1;//若数组为空或者最小值大于1,则返回1
13 // if (nums.size() == 1)return nums[0] == 1 ? 2 : 1;//当且只有1个元素时,若是1,就返回2否则返回1
14 // for (int i = nums.size() - 2; i >= 0; --i) {
15 // if (nums[i] - nums[i + 1] > 1)//找到间隔大于1的相邻两数,
16 // return nums[i + 1] + 1;//返回较小数+1
17 // }
18 // return nums[0] + 1;//返回最大数+1
19 // }
20 //};
21
22
23 //第二种解法更好用
24 //先排序,将小于1的数删除,然后存入剩下的数,若数组下角标不是该值,则返回该数
25 //我以为会很快,但都是12ms,但点子很好,你觉得呢?
26 class Solution {
27 public:
28 int firstMissingPositive(vector<int>& nums) {
29 sort(nums.begin(), nums.end());//排序
30 vector<int>v;
31 v.push_back(0);//将0与下标为0的位置占用
32 for (int i = 0, j = 0; i < nums.size(); ++i) {
33 if (nums[i] < 1 || nums[i] == v.back())continue;//排除小于1的数和去除重复数字
34 v.push_back(nums[i]);
35 ++j;
36 if (j != nums[i])return j;//小角标未与该处的数字对应
37 }
38 return v.back() + 1;//原数组是连续的,返回最大数+1;
39 }
40 };
41
42
43 //博客的解答
44 //我怎么感觉复杂一丢丢
45 //除了排序是自己做的,原理都一样,找下角标
46 //同样12ms
47 class Solution {
48 public:
49 int firstMissingPositive(vector<int>& nums) {
50 int n = nums.size();
51 for (int i = 0; i < n; ++i) {
52 while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
53 swap(nums[i], nums[nums[i] - 1]);
54 }
55 }
56 for (int i = 0; i < n; ++i) {
57 if (nums[i] != i + 1) return i + 1;
58 }
59 return n + 1;
60 }
61 };
62
63 void T041() {
64 Solution s;
65 vector<int>n;
66 n = {2,1 };
67 cout << s.firstMissingPositive(n) << endl;
68 n = { 3,4,-1,1 };
69 cout << s.firstMissingPositive(n) << endl;
70 n = { 7,8,9,11,12 };
71 cout << s.firstMissingPositive(n) << endl;
72 n = {100,-9};
73 cout << s.firstMissingPositive(n) << endl;
74 n = { 0,2,2,1,1 };
75 cout << s.firstMissingPositive(n) << endl;
76 }