資料結構API 力扣刷題(陣列篇)

2021-10-25 09:40:10 字數 4639 閱讀 5597

列表:

刪除元素

返回列表副本 list.copy()

返回具有指定值的元素數量 list.count(value)

顛倒列表順序 list.reverse()

返回具有指定值的第乙個元素的索引 list.index(value)

對列表進行排序 list.sort(reverse=true|false, key=myfunc) reverse=true是對列表進行降序排列,預設是false;key是指定排序標準的函式

stl中的向量和表:

(對所有stl容器通用)

對vector和list都適用

僅對list有效

僅對vector有效

迭代器獲得迭代器:

迭代器操作:

需要迭代器的容器操作:

直接用hash表把每個值作為key,把他們的索引存起來,從頭開始,將訪問過的值存進hash表,並檢查hash表中有沒有target-nums[i],有就直接返回索引了。

hashset=

for i in

range

(len

(nums)):

if hashset.get(target-nums[i])is

notnone

:return

[hashset.get(target-nums[i]

),i]

hashset[nums[i]

]=i

雙指標!

先把陣列排序。用for迴圈遍歷first,先固定first,再用兩個指標,乙個從first+1的位置,乙個從陣列的末尾,將兩個元素的和和target比較。固定first+1的位置,如果兩個元素的和大於target,將最右邊的指標往左移,如此迴圈。

官方題解:

class

solution

:def

threesum

(self, nums: list[

int])-

> list[list[

int]]:

n =len(nums)

nums.sort(

) ans =

list()

# 列舉 a

for first in

range

(n):

# 需要和上一次列舉的數不相同

if first >

0and nums[first]

== nums[first -1]

:continue

# c 對應的指標初始指向陣列的最右端

third = n -

1 target =

-nums[first]

# 列舉 b

for second in

range

(first +

1, n)

:# 需要和上一次列舉的數不相同

if second > first +

1and nums[second]

== nums[second -1]

:continue

# 需要保證 b 的指標在 c 的指標的左側

while second < third and nums[second]

+ nums[third]

> target:

third -=

1# 如果指標重合,隨著 b 後續的增加

# 就不會有滿足 a+b+c=0 並且 bif second == third:

break

if nums[second]

+ nums[third]

== target:

[nums[first]

,nums[second]

,nums[third]])

return ans

仍然是雙指標!

還是先對陣列排序。先for迴圈遍歷整個陣列,每次迴圈中,指定second指標指向first+1的位置,third指標指向陣列最後乙個元素,和target比較,如果大於target就右邊的往左移,如果小於target就左邊往右移。將三個位置的元素之和和target的差與之前得到的最好的和和target的差比較,更新一下最好的結果。

優化:在比較前還可計算出當固定first時可以得到的三數之和的最大值與最小值,如果最大值小於target,可以跳過這一迴圈,如果最小值大於target,那麼這個就是最終答案了,直接結束迴圈。

官方題解:

class solution:

def threesumclosest(self, nums: list[int], target: int) -> int:

n=len(nums)

nums.sort()

ans=float('inf')

for first in range(n-2):

if first>0 and nums[first]==nums[first-1]:

continue

second,third=first+1,n-1

max_sum=nums[first]+nums[-2]+nums[-1]

min_sum=nums[first]+nums[first+1]+nums[first+2]

if max_sum<=target:

if abs(max_sum-target)=target:

if abs(min_sum-target)tow_sum_target:

third-=1

while second還是按照三數之和的思路,用兩個for迴圈,用first和second遍歷,每個迴圈中,固定first和second,看情況移動third和fourth。

優化:在first那一層的迴圈中先計算出最大值和最小值,如果最大值小於target,可以跳過這一迴圈,如果最小值大於target,就結束整個迴圈。在second那一層也做這樣的優化。

class

solution

:def

foursum

(self, nums: list[

int]

, target:

int)

-> list[list[

int]]:

n=len(nums)

nums.sort(

) ans=

first=

0while firstif nums[first]+3

*nums[first+1]

>target:

break

if nums[first]+3

*nums[-1

]while first4and nums[first]

==nums[first+1]

:first+=

1 first+=

1continue

second=first+

1while secondif nums[first]

+nums[second]+2

*nums[second+1]

>target:

break

if nums[first]

+nums[second]+2

*nums[-1

]while second3and nums[second]

==nums[second+1]

:second+=

1 second+=

1continue

third,fourth=second+

1,n-

1 two_sum_target=target-nums[first]

-nums[second]

while thirdif nums[third]

+nums[fourth]

third+=

1elif nums[third]

+nums[fourth]

>two_sum_target:

fourth-=

1else

:[nums[first]

,nums[second]

,nums[t]

,nums[fourth]])

third+=

1 fourth-=

1while third==nums[third-1]

: third+=

1while third==nums[fourth+1]

: fourth-=

1while second3and nums[second]

==nums[second+1]

: second+=

1 second+=

1while first4and nums[first]

==nums[first+1]

: first+=

1 first+=

1return ans

力扣刷題 陣列系列 2

刷題的順序,按照前輩的leetcode cookbook上的順序 給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成 思考 1.題目要求原地刪除重複的元素,...

資料結構刷題 陣列

給定乙個矩陣 a,返回 a 的轉置矩陣。先建立乙個與原始矩陣行列數互換的新矩陣 做兩個迴圈巢狀,內迴圈遍歷原始矩陣的行轉列,外矩陣遍歷原始矩陣的列 class solution return v 逐行的細緻解釋 vector 建立了二維陣列,兩個空格可以在c 11標準中可以剔除 a 0 size 獲...

刷題 力扣 697 陣列的度

題目鏈結 題目描述 給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是在 nums 中找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻...