leetcode之路(缺失的第乙個正數)

2021-09-27 07:59:42 字數 1406 閱讀 7889

題目:

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]

輸出: 3

示例 2:

輸入: [3,4,-1,1]

輸出: 2

示例 3:

輸入: [7,8,9,11,12]

輸出: 1

說明:你的演算法的時間複雜度應為o(n),並且只能使用常數級別的空間。

「實現乙個功能如果需要10分鐘,思考的時間是7分鐘」思考過程

拿到題目最容易想到的方法是對陣列先排序,然後從一往後找,就可以很輕鬆的找到缺失的正數。

**方法一:**使用sort()對陣列進行排序,然後從1還是逐個找下乙個正數,如果找到的結果大於應該出現的正數,說明該數即是所求。方法關鍵**:

int firstmissingpositive(vector& nums) 

return ret;

}

but題目要求中「你的演算法的時間複雜度應為o(n),並且只能使用常數級別的空間。」sort()函式的時間複雜度為nlog2(n),顯然我們的**雖然可以求出題目的答案,但並不符合題目要求。於是就有了相對高階的方法二。

方法二:方法二的思想與方法一無異,但是改進了一下排序的方法,我們使用交換位置的方法對原來的陣列原地排序(當給我們的nums[0]是3時,我們可以讓nums[0]與num[2]交換這樣3就回到了正確的位置,直到nums[0]=1時再到nums[1]的值進行操作),根據題意我們只需對正數進行排序,但是有這麼幾種情況是我們無法找到正確的位置的:

1、nums[i]>nums.size(),或者nums[i]<1,這時的i-1下標越界,直接i++

2、nums[i]==nums[nums[i]-1],這個數對應位置上的數已經是正確的了,說明有重複數字,直接i++;

為了方便理解,附上乙個例子:當nums=時,該演算法的執行過程為:

方法二的**如下:

class solution 

}for(int i=0;i提交結果

執行用時 :4 ms

, 在所有 c++ 提交中擊敗了86.60%的使用者

記憶體消耗 :8.6 mb

, 在所有 c++ 提交中擊敗了81.74%的使用者

LeetCode 缺失的第乙個正數

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思路分析 解此題需要在序列中確定缺失的最小的...

第乙個缺失的正整數 leetcode

為什麼不能nums這樣賦值呢?nums nums i nums i 呢 例如 如果陣列中存在3 那麼我們可不可以nums 3 3呢?這樣最後的結果會不會和 0,1,2,3,4,5 嗎?然後對這個陣列從1開始遍歷不就好了嗎這樣做事不行的,因為 1,2,3,0 這樣最後的結果就是 1,1,0,3 因為值...

Leetcode 求缺失的第乙個正數

求缺失的第乙個正數 給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思路 盡可能地把陣列中不...