LeetCode(41) 缺失的第乙個正數

2022-05-07 08:33:10 字數 1145 閱讀 3270

hard!

題目描述:

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

示例 1:

輸入: [1,2,0]

輸出: 3

示例 2:

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

輸出: 2

示例 3:

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

輸出: 1

說明:

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

解題思路:

這道題讓我們找缺失的首個正數,由於限定了o(n)的時間,所以一般的排序方法都不能用。

最開始沒有看到還限制了空間複雜度,所以想到了用hashset來解,這個思路很簡單,第一遍遍歷陣列把所有的數都存入hashset中,並且找出陣列的最大值,下次迴圈從1開始遞增找數字,哪個數字找不到就返回哪個數字,如果一直找到了最大的數字,則返回最大值+1,**如下。

c++解法一:

1

//not constant space

2class

solution

12for (int i = 1; i <= mx; ++i)

15return mx + 1;16

}17 };

但是上面的解法不是o(1)的空間複雜度,所以我們需要另想一種解法,既然不能建立新的陣列,那麼我們只能覆蓋原有陣列,我們的思路是把1放在陣列第乙個位置nums[0],2放在第二個位置nums[1],即需要把nums[i]放在nums[nums[i] - 1]上,那麼我們遍歷整個陣列,如果nums[i] != i + 1, 而nums[i]為整數且不大於n,另外nums[i]不等於nums[nums[i] - 1]的話,我們將兩者位置調換,如果不滿足上述條件直接跳過,最後我們再遍歷一遍陣列,如果對應位置上的數不正確則返回正確的數。

c++解法二:

1

class

solution 9}

10for (int i = 0; i < n; ++i)

13return n + 1;14

}15 };

leetcode 41 缺失的第乙個正數

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

LeetCode 41 缺失的第乙個正數

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1 2,0 輸出 3示例 2 輸入 3 4,1,1 輸出 2示例 3 輸入 7 8,9 11,12 輸出 1說明 這題確實挺坑的,首先對陣列排個序,當時想用陣列標記的,沒想到還有int max級別的數,不過vector應該是裝...

Leetcode 41 缺失的第乙個正數

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3示例 2 輸入 3,4,1,1 輸出 2示例 3 輸入 7,8,9,11,12 輸出 1說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。這個題第乙個想法是排序,然後遍歷即可,但是時間複雜...