1. 這題其實沒有想象中的那麼難,關鍵得利用數組的特性,我們得將不在正確位置的數放在對應的正確的位置上,然後再遍歷,得到不滿足條件的那個數,即爲缺失的那個數.
2. 卡了好長時間是因爲這個交換兩個數需要特別注意,順序錯了不行,因爲交換的數的索引含有nums[i],即爲nums[nums[i]-1],因此順序一點不能錯,這也是最需要注意的地方.
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
//邊界條件
if(nums.size()==0) return 1;
for(int i=0;i<nums.size();) {
//只有當數不在範圍內,或者對應的數在正確的位置,纔不需要做任何改變.
//也只有此時才能i++,因爲下面交換過的數有可能還是不在正確的位置,
//所以一直到滿足if條件纔不需要繼續交換.
if(nums[i]<=0 || nums[i]>=nums.size()+1 || nums[nums[i]-1]==nums[i]) {
i++;
continue;
}
//不在正確的位置需要交換到正確的位置.
//強烈注意交換的順序,只能有這麼一種方式,
//因爲nums[i]也出現在索引中,所以我們只能最後改變
//nums[i]的值纔不會影響前面的交換.
int tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
}
//遍歷找到不在正確位置的數返回,即爲缺失的值.
for(int i=0;i<nums.size();i++) {
if(nums[i]!=i+1) return i+1;
}
//如果都滿足,則缺失之後的數.
return nums.size()+1;
}
};