其他分享
首页 > 其他分享> > 力扣 题目41-- 缺失的第一个正数

力扣 题目41-- 缺失的第一个正数

作者:互联网

题目


题解

1.首先题目中提到我们只需要输出 最小的正整数即可 那么只看正数 0和负数都不看了

2.超过vector长度的数字也不用看 因为最好的结果 也就是1,2,3,4  5是解 也就是说最小的正整数的解 最大也就是vector的长度+1 而超过vector长度的自然也不用管

知道上面两个前提之后再来看下面两个方法

方法1--其他容器(方法来着力扣评论区老哥)

1.创建一个和nums长度+1(下标对齐)的 vector 然后全部放入0这里命名为ernums

2.遍历nums 当nums[i] > 0&& nums[i]<= nums.size() 则将ernums对应的位置ernums[nums[i]] = 1; 改为1

3.从1开始遍历ernums 第一次出现0的下标就是答案

4.如果都是1 说明答案是最大+1 直接返回ernums的长度即可

方法2--自身修改(方法来着官方题解)

方法1中我们用了ernums  当遍历到对应的数时就修改ernums 那么我们能不能直接对nums修改?

1.将负数和0改为nums.size()+1; 这样就全是正数 方便下面步骤

2.遍历一般nums 我们要将|nums[i]|-1 位置改为负数 即 

int num = abs(nums[i]);

nums[num - 1] = -nums[num -1];

这样代表的数字 对应位置就会变为负 和方法1的思路差不多

3.遍历nums 答案是第一个正数的位置加 1

4.如果数组中的每一个数都是负数,那么答案是 nums.size() + 1

代码

代码1

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     int firstMissingPositive(vector<int>& nums) {
 8         //写一个vector记录 nums.size()+1是为了下标可以对齐 0舍弃不用
 9         vector<int> ernums(nums.size()+1, 0);
10         //如果1有则将ernums[1]变为1 同理
11         for (int i = 0; i < nums.size(); i++) {
12             if (nums[i] > 0&& nums[i]<= nums.size()) {
13                 ernums[nums[i]] = 1;
14             }
15         }
16         //从一开始遍历 第一次出现0的位置就是答案
17         for (int i = 1; i < ernums.size(); i++) {
18             if (ernums[i] == 0) {
19                 return i;
20             }
21         }
22         //如果都是1 说明答案是最大+1 直接返回ernums的长度即可
23         return ernums.size();
24     }
25 };
26 
27 int main() {
28     Solution sol;
29     vector<int> nums = {2,1};
30     int num=sol.firstMissingPositive(nums);
31     cout << num << endl;
32 }
View Code

代码2

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     int firstMissingPositive(vector<int>& nums) {
 8         //1.我们将数组中所有小于等于 0的数修改为 N+1;
 9         for (int i = 0; i < nums.size(); i++) {
10             if (nums[i] <= 0) {
11                 nums[i] = nums.size()+1;
12             }
13         }
14        //2.给数组中的第 |x|-1 个位置的数添加一个负号。
15         for (int i = 0; i < nums.size(); i++) {
16             int num = abs(nums[i]);
17             if (num <= nums.size() ) {
18                 if (nums[num - 1] > 0) {
19                     nums[num - 1] = -nums[num -1];
20                 }
21             }
22         }
23         //3.在遍历完成之后,如果数组中的每一个数都是负数,那么答案是 N+1,否则答案是第一个正数的位置加 1。
24         for (int i = 0; i < nums.size(); i++) {
25             if (nums[i] > 0) {
26                 return i + 1;
27             }
28         }
29         return nums.size() + 1;
30     }
31 };
32 
33 int main() {
34     Solution sol;
35     vector<int> nums = {2,1};
36     int num=sol.firstMissingPositive(nums);
37     cout << num << endl;
38 }
View Code

 

标签:ernums,num,nums,--,41,力扣,int,vector,size
来源: https://www.cnblogs.com/zx469321142/p/16215755.html