列表:
刪除元素
返回列表副本 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的出現頻...