力扣 题目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 }
代码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 }