LeetCode 41. 缺失的第一個正數(First Missing Positive)
阿新 • • 發佈:2018-09-11
style 第一個 交換 ret etc 沒有 解題思路 ssi !=
題目描述
給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
說明:
你的算法的時間復雜度應為O(n),並且只能使用常數級別的空間。
解題思路
本題讓只能使用常數級別的空間,所以哈希的解法只能放棄了。考慮另一種思路,把數字依次放到他們對應的位置上,比如1放到第一個(數組第0個)位置上,2放到第二個(數組第1個)位置上,通過交換可得到,若該位置上的數不是正數或者大於數組的長度就跳過。這樣調整完整個數組後,再從數組首位置開始判斷,若對應位置上的數錯誤就返回該位置,若都擺放正確,就返回數組長度加1.
代碼
1 class Solution { 2 public: 3 int firstMissingPositive(vector<int>& nums) { 4 int i = 0; 5 while(i < nums.size()){ 6 while(nums[i] > 0 && nums[i] <= nums.size() && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) 7 swap(nums[i], nums[nums[i] - 1]); 8 i++; 9 } 10 for(int i = 0; i < nums.size(); i++) 11 if(nums[i] != i + 1) 12 return i + 1; 13 return nums.size() + 1; 14 } 15 };
LeetCode 41. 缺失的第一個正數(First Missing Positive)