1. 程式人生 > >Leetcode 41:缺失的第一個正數(最詳細的解法!!!)

Leetcode 41:缺失的第一個正數(最詳細的解法!!!)

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

示例 1:

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

示例 2:

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

示例 3:

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

說明:

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

解題思路

我們首先想到的做法是對nums排序,然後遍歷[min(nums),max(nums)]區間內的所有數,找到第一個不在nums中的正整數即可。

class Solution:
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
if not nums: return 1 nums.sort() for i in range(1, nums[-1]+1): if i not in nums: return i return nums[-1] + 1

但是問題中說了只能是O(n)級別的演算法,所以我們不能使用排序演算法。而且演算法又是O(n)級別,所以我們很容易猜到做法就是通過遍歷一遍陣列就可以得到答案。但是要怎麼做呢?我們首先想到的做法是這樣,我們先定義一個很大的陣列mem

,然後遍歷nums中的每個元素num,對mem[num]=1,這樣我們只要再次遍歷mem,找到第一個mem[i]==0的元素,那麼i就是我們要找的值。很不錯的想法是不是?但是我們這裡還有一個問題,這個陣列要定義多大呢?max(nums)+1即可。

class Solution:
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 1

        max_len =
max(nums)+1 mem = [0]*max_len mem[0] = 1 for num in nums: if num > 0: mem[num] = 1 for i, val in enumerate(mem): if val != 1: return i return max_len

這種解法我認為是目前leetcode上的最佳解法。

如有問題,希望大家指出!!!