思路:解題思路很巧妙。本題的思路是從前日後將數放到它正確的位置上去。python
舉個例子,假設有序列[4,2,6,1,-3],首先看第一個數4,它正確的位置應該是在序列的第4個位置(位置數從1開始,正確的位置是第一個位置放1,第二個位置放2,第三個位置放3……最後咱們只要看哪一個位置放的不是理想的數,那麼它就是第一個缺失的正數)。咱們將4與第4個位置上的「1」進行交換,序列變成[1,2,6,4,-3];接着咱們仍是看第一個數,如今變成了「1」,它的確在它正確的位置,好了,咱們再看第二個數2,也在正確的位置。第三個數6,原本應該放在第6個位置,但是該序列總共就5個位置,因此不移動;第四個數4在它的正確位置,不動;第五個數是負數,不動。最後,從前日後看,發如今第三個位置本該出現的3沒有出現,全部該序列缺失的第一個正數是3。數組
因此概括來講,將每一個數放在它正確的位置,前提是該數是正數,而且該數小於序列長度,而且它正確位置上的那個數不是它,也就是說,把4要放在第4個位置,要保證第4個位置上的數不是4,若是是4的話,交換先後沒什麼變換,把兩個4移來移去,還會形成死循環。spa
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
for i in range(len(nums)):
while nums[i] > 0 and nums[i]<len(nums) and nums[nums[i]-1] != nums[i]:
nums[nums[i]-1], nums[i] = nums[i] ,nums[nums[i]-1]
for i in range(len(nums)):
if nums[i] != i+1:
return i+1
return len(nums)+1
複製代碼
咱們將數組分爲四組:紅色,白色,非分類和藍色。最初,咱們將全部元素分組爲非分類。只要白色指針小於藍色指針,咱們就從頭開始迭代。3d
若是白色指針爲紅色(nums [white] == 0),咱們用紅色指針交換並向前移動白色和紅色指針。若是指針是白色的(nums [white] == 1),則元素已經在正確的位置,所以咱們沒必要交換,只需向前移動白色指針。若是白色指針爲藍色,咱們將交換最新的未分類元素。指針
class Solution(object):
def sortColors(self, nums):
red, white, blue = 0, 0, len(nums) - 1
while white <= blue:
if nums[white] == 0:
nums[red], nums[white] = nums[white], nums[red]
white += 1
red += 1
elif nums[white] == 1:
white += 1
else:
nums[white], nums[blue] = nums[blue], nums[white]
blue -= 1
複製代碼