https://leetcode.com/problems/first-missing-positive/
如果是只缺一个数的话,好说,就是求和, 然后n*(n+1)/2 -sum 就是缺的数字
但是,,,这道题,这样的数据也是要求有正确结果的:
3
1 4 5
这类题最终要的是:找到一些性质
这个题需要理解的性质是,假设缺的数是ans,那么他应该出现在下标为ans-1 的位置
而且下标为0 ~ ans-2都是符合nums[i] = i+1
有两个trick:
(1)如果现在的序列已经是,比如数组大小是3, 1-3都有,那么应该返回数组长度+1
(2)有重复的数字的时候,这个时候可能死循环,比如2应该放到第1个位置,那么再遇到一个2,就要跟第一个位置的2交换了,就这样死循环,,,,
所以无效的交换不要做
测试数据:
2
1 1
应该返回2
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <map> #include <set> using namespace std; class Solution { public: int firstMissingPositive(vector<int>& nums) { int ptr=0; while(ptr<nums.size()) { if(nums[ptr] == ptr+1 || nums[ptr]<=0 || nums[ptr]>=nums.size() || nums[ptr] == nums[ nums[ptr]-1 ]) ptr++; else { //cout << nums[ptr] << " , " << nums[ nums[ptr]-1 ] << endl; swap(nums[ptr], nums[ nums[ptr]-1 ]); } } for(int i=0;i<nums.size();i++) if(nums[i] != i+1)return i+1; return nums.size()+1; } }; int main() { int n,in; while(cin >> n) { vector<int> ivec; for(int i=0;i<n; i++) { cin >> in; ivec.push_back(in); } Solution s; cout << s.firstMissingPositive(ivec) << endl; } return 0; }