[LeetCode]41. 缺失的第一個正數

題目

給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]
輸出: 3

示例 2:

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

示例 3:

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

提示:
你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。

解題思路

因爲我們要找的數在 [1, N + 1] 裏,最後 N + 1 這個元素我們不用找,只有在前面的 N 個元素都找不到的情況下,我們才返回 N + 1。所以我們可以把原始的數組當做哈希表來使用,將數值爲 i 的數映射到下標爲 i - 1 的位置,例如 1 這個數放到下標爲 0 的位置, 2 這個數放到下標爲 1 的位置,按照這種思路整理一遍數組。然後我們再遍歷一次數組,第一個遇到的值不等於下標 +1 的那個數,那下標 +1 就是我們要找的缺失的第一個正數。如果遍歷完數組也沒找到,就返回 N + 1。

複雜度分析:
時間複雜度:O(N),其中 N 是數組的長度。
空間複雜度:O(1)。

代碼

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i=0; i<n; i++){
            // 滿足在指定範圍內、並且沒有放在正確的位置上,才交換
            // 例如:數值 3 應該放在索引 2 的位置上
            while(nums[i]>=1 && nums[i]<=n && nums[i] != nums[nums[i]-1]){
                // 交換兩個數
                int temp = nums[i];
                nums[i] = nums[temp-1];
                nums[temp-1] = temp;
            }
        }
        for(int i=0; i<n; i++){
            if(nums[i] != i+1){
                return i+1;
            }
        }
        return n+1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章