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 }