力扣算法题—041缺失的第一个正数

 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 }

猜你喜欢

转载自www.cnblogs.com/zzw1024/p/10575273.html