知識點:陣列;雜湊表給你乙個未排序的整數陣列 nums ,請你找出其中沒有出現的最小的正整數。
請你實現時間複雜度為 o(n) 並且只使用常數級別額外空間的解決方案。
示例
輸入:nums = [1,2,0]
輸出:3
輸入:nums = [3,4,-1,1]
輸出:2
輸入:nums = [7,8,9,11,12]
輸出:1
其實仔細想一下這道題,缺失的第乙個正數,假設陣列的長度為n,那答案是多少呢?答案其實只能在[1,n+1]之間,這些數都有,那答案就是n+1,陣列裡一旦缺失乙個,那就在這之間了
所以可以新建乙個雜湊表,然後將陣列中的數存到雜湊表中,然後從1到n+1開始遍歷,依次檢視是否在雜湊表裡,第乙個找到的不在的,那就是答案了;
為什麼要用雜湊表呢,因為雜湊表查詢的快啊,這樣時間和空間複雜度都是n;
那怎麼不建立新的空間呢,雜湊表是什麼,不就是乙個key-value鍵值對嗎?陣列不也是這樣的嗎?其實雜湊表就是乙個陣列對吧;
那我們就可以直接在原始陣列上去進行操作了,比如乙個數為x,那就可以把這個數放到索引為x-1的位置上去,這樣我們不就自己構造了乙個雜湊表嗎?前提是這個數x在索引的範圍內,那這樣一遍完後,在【1,n】範圍內的元素就放在了「該在的位置上去」,也就是nums[i] = i+1,那再看一遍,從0到n-1的位置上那些有的值已經到了自己的位置,一旦不一樣,那這個位置+1就是我們要找的元素了;
class solution:
def firstmissingpositive(self, nums: list[int]) -> int:
size = len(nums)
for i in range(size):
while nums[i] >=1 and nums[i] <= size and nums[i] != nums[nums[i]-1]: # nums[i]在下標的範圍內,並且兩個不相等
index = nums[i]-1
nums[index], nums[i] = nums[i], nums[index]
for i in range(size):
if nums[i] != i+1:
return i+1
return size+1
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 並且只能使用常數級別的空間。這個題第乙個想法是排序,然後遍歷即可,但是時間複雜...