leetcode刷題筆記(四) 陣列相關的問題

2021-10-01 11:32:45 字數 3486 閱讀 4793

1、給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。

def

movezeroes

(self, nums: list[

int])-

>

none

:"""

do not return anything, modify nums in-place instead.

"""#j表示下乙個非0元素的位置

j =0 l =

len(nums)

for i in

range

(l):

#遇到0就跳過繼續遍歷,找到非0就讓這個值放到j位置,並把j更新,遍歷完整個陣列即可

if nums[i]!=0

: nums[j]

,nums[i]

= nums[i]

,nums[j]

j+=1

時間複雜度:o(n),一般情況下這種需要遍歷的操作,最好要求能達到o(n),可以考慮結合hash來進行操作。

2、給定乙個陣列 nums 和乙個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o1 額外空間的條件下完成。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

思路:

還是要遍歷陣列,考慮當陣列中這個值不等於val,就代表新陣列中要有它,所以用乙個j游標存放不等於val的位置,然後遍歷陣列即可

def

removeelement

(self, nums: list[

int]

, val:

int)

->

int:

size =

len(nums)

j =0#統計不等於val的個數和下標

for i in

range

(size)

:#如果不等於val就放在j上,把j後移

if nums[i]

!= val:

nums[j]

=nums[i]

j +=

1return j

3、給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2],

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。

你不需要考慮陣列中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。

你不需要考慮陣列中超出新長度後面的元素。

這道題類似第二題:

def

removeduplicates

(self, nums: list[

int])-

>

int:

size =

len(nums)

if size ==0:

return

0#j從1開始,對應位置儲存不重複數字的值

j =1for i in

range

(size)

:#越過0

if i ==0:

continue

#由於是排序陣列,所以當出現不相等時,就把放在j的位置,並且更新j

if nums[i]

!= nums[i-1]

: nums[j]

=nums[i]

j +=

1return j

4、給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。

基本思路給在了注釋裡,這裡只要想清楚一些細節的地方就可以了

def

removeduplicates

(self, nums: list[

int])-

>

int:

size =

len(nums)

if size ==0:

return

0 j =

0#記錄新陣列的長度

curret_num = nums[0]

#記錄當前的數字

count =

0#記錄當前數字出現的次數

for i in

range

(size)

:if i ==0:

count =

1 j =

1continue

if nums[i]

!= nums[i-1]

:#找到不相等的情況需要更新當前數字資訊

curret_num = nums[i]

nums[j]

= nums[i]

j +=

1 count =

1continue

if nums[i]

== curret_num and count <2:

#等於當前數字情況下,計數必須小於2,否則繼續向後

count +=

1 nums[j]

= nums[i]

#需要更新第j個位置的值

j +=

1return j

還有一種更精簡的解法:

def

removeduplicates

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""l =

len(nums)

if l <=2:

return l

counter =

2for i in

range(2

, l)

:if nums[i]

!= nums[counter -2]

: nums[counter]

= nums[i]

counter +=

1return counter

總之:在陣列中,遍歷一遍就解決了問題,可以使得複雜度降低很多。

願每乙個程式設計師都能被溫柔相待

Leetcode刷題筆記(C ) 陣列

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,3,...

Lettcode刷題筆記 四 陣列

以後打算刷題按照同樣的型別來。941.有效的山脈陣列 我的解法 class solution 找到最大值以及它的座標 for int i 1 i arr.length i 判斷左側 for int i 1 i maxindex i 考慮兩種特殊情況 if maxindex arr.length 1 ...

leetcode 刷題筆記(簡單題)陣列篇

初始化陣列 int a int b new int arrays.tostring b 輸出陣列 int c new int 3 指定陣列長度 新建 arraylist 物件 arraylistarr new arraylist arr.add 1 新增元素 o 1 arr.add 3,99 向下標...