對於陣列的處理,是leetcode中一種非常常見的題型。針對陣列結構的處理,我自己整理了一些常用的解題思路,便於在面對問題時,迅速思索解題方法。
1.滑窗法
2.雙指標
3.構建左右側雙列表
4.利用資料結構
1.滑窗法
滑窗法一般用於處理陣列中多個數字之間關係。 一般的結構是,乙個for迴圈巢狀乙個while迴圈,並結合max或者min方法進行判斷。 相關的題目見上述鏈結。
2.雙指標
雙指標方法一般有兩種應用場景:
l,r =0,
len(
list)-
1
另一種左右指標是以出現的每各index為中軸,左減右加。這種方式運用比較少,可以用於判定字串中的回文字串,見密碼擷取
3.構建左右側雙列表
構建左右列表問題,一般需要考慮陣列中三個值的關係,例如比較是否遞增,中間值是否最小等等。
因此,我們一般會構建兩個和原陣列等長的陣列,按照陣列中的每個元素,分別統計其左側情況與右側情況,維護其左側結果和右側結果。
典型的題目有:
334. 遞增的三元子串行
給定乙個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子串行。
思路:
對於乙個長度為3的遞增序列,我們只需要考慮陣列中的每乙個數字左側是否有數字比其小,右側是否有數字比其大即可。
這樣,我們需要維護兩個陣列,分別記錄原陣列中每個數字左側最小值和右側最大值。隨後,分別對比相同索引位置,是否有:左側《當前《右側
。
相應**如下:
class
solution
:def
increasingtriplet
(self, nums: list[
int])-
>
bool:if
len(nums)
<3:
return
false
small =
[nums[0]
]*len(nums)
large =
[nums[-1
]]*len
(nums)
for i in
range(1
,len
(nums)):
small[i]
=min
(nums[i]
,small[i-1]
)for j in
range
(len
(nums)-2
,-1,
-1):
large[j]
=max
(large[j+1]
,nums[j]
)for i in
range
(len
(nums)):
if small[i]
< nums[i]
< large[i]
:return
true
return
false
238. 除自身以外陣列的乘積
給你乙個長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。
思路:
計算除自身外所有元素的乘積,但是題目要求不可以使用除法。因此我們考慮構建兩個list分別計算每個元素左側的乘積和右側的乘積,隨後將相同索引位置的左右list中的元素相乘即可。
進一步,題目要求不使用除了結果之外的額外空間,所以先在結果list上計算所有元素左側的值,進一步在此基礎上乘計算所有元素右側的值,即為結果。
class
solution
:def
productexceptself
(self, nums: list[
int])-
> list[
int]
: res =[1
]*len(nums)
n =len(nums)
r =1for i in
range(1
,n):
res[i]
= res[i-1]
*nums[i-1]
for j in
range
(n-1,-
1,-1
):res[j]
= res[j]
*r r = r*nums[j]
return res
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
思路:
一種比較直觀的邏輯是:只有柱子左右兩側存在更高柱子的位置才能夠儲水。這樣我們需要維護兩個list計算每個柱子左側和右側最大值。
當然此問題存在不構建list的簡便方式,但思路不具備一般性,不容易想到。故這裡不多涉及。
class
solution
:def
trap
(self, height: list[
int])-
>
int:
#分別計算左側和右側最大值
l =[0
] r =
for i in
range(1
,len
(height)):
tmp1 =
max(height[
0:i]
)if tmp1 < height[i]0)
else
for j in
range
(len
(height)-1
):tmp2 =
max(height[j+1:
])if tmp2 < height[j]0)
else0)
print
("l is"
,l)print
("r is"
,r)#累計計算可以的積雨量
res =
0for idx in
range
(len
(height)-1
):res +=
max(
(min
(l[idx]
,r[idx]
)- height[idx]),
0)return res
4.利用資料結構
一般可以運用的資料結構及方式通常有:
常見的題目有:
350. 兩個陣列的交集 ii
給定兩個陣列,編寫乙個函式來計算它們的交集。
思路:
通過乙個字典記錄陣列1中每個元素的出現次數,遍歷陣列2,如果2中的元素出現在1中,則字典相應的計數減1.
class
solution
:def
intersect
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]:if
len(nums1)==0
orlen
(nums2)==0
:return
map1 =
res =
for i in nums1:
map1[i]
= map1.setdefault(i,0)
+1for j in nums2:
if j in map1.keys(
)and map1[j]
>0:
map1[j]-=1
return res
leetcode陣列中的問題(十)
目錄 面試題 08.04.冪集 同78.子集 90.子集 ii 46.全排列 77.組合 39.組合總和 冪集。編寫一種方法,返回某集合的所有子集。集合中不包含重複的元素。說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 一 ...
LeetCode 陣列 跳躍問題
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fal...
LeetCode 陣列排序問題
給定乙個非負整數陣列 a,a 中一半整數是奇數,一半整數是偶數。對陣列進行排序,以便當 a i 為奇數時,i 也是奇數 當 a i 為偶數時,i 也是偶數。你可以返回任何滿足上述條件的陣列作為答案 輸入 4,2,5,7 輸出 4,5,2,7 解釋 4,7,2,5 2,5,4,7 2,7,4,5 也會...