給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。css
示例 1:算法
輸入: [1,2,0]
輸出: 3
示例 2:數組
輸入: [3,4,-1,1]
輸出: 2
示例 3:網絡
輸入: [7,8,9,11,12]
輸出: 1
說明:spa
你的算法的時間複雜度應爲O(n),而且只能使用常數級別的空間。code
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/first-missing-positive
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。blog
1 class Solution { 2 public: 3 int firstMissingPositive(vector<int>& nums) { 4 //這是看了解答後的代碼 知足題意 但速度沒提升太多 5 int size = nums.size(); 6 7 int *numsHash; 8 int size_hash = size +1; 9 10 //建立一個哈希表 初始化爲0 11 numsHash = new int[size_hash](); 12 //遍歷nums 對於小於數組長度的元素在哈希表中打個標記 13 //對於比數組長度大的數據能夠忽略,由於第一個缺失的正數沒這麼大 14 for (int i = 0; i < size; ++i) 15 { 16 if (nums[i] > 0 && nums[i] < size_hash) 17 { 18 numsHash[nums[i]] = 1; 19 } 20 } 21 22 //遍歷哈希表 找出第一個沒打標記的 23 int *end_pos = numsHash + size_hash; 24 for (int *p = numsHash + 1; p != end_pos; ++p) 25 { 26 if (*p == 0) 27 { 28 return p - numsHash; 29 } 30 } 31 32 return size_hash; 33 } 34 35 int firstMissingPositiveNew(vector<int>& nums) { 36 37 //這是我本身想的答案,不符合題目O(n)要求,但排名也挺高 38 //排序 而後找出第一個大於0的數字 39 //順序查找下去,直到發現本元數比上一個元素大1就說明找到了 40 sort(nums.begin(), nums.end());
//從1開始找出第一個不在數組裏面的正數 慢 41 //for (int i = 1; i <= INT_MAX; ++i) 42 //{ 43 // if (!binary_search(nums.begin(), nums.end(), i)) 44 // { 45 // return i; 46 // } 47 //} 48 49 auto it = upper_bound(nums.begin(), nums.end(), 0); 50 51 if (it == nums.end() || *it != 1) return 1; 52 53 for (++it; it != nums.end(); ++it) 54 { 55 if ((*it - *(it - 1)) > 1) 56 { 57 return *(it - 1) + 1; 58 } 59 } 60 61 return *(it - 1) + 1; 62 } 63 };