leetcode中陣列問題常用的處理方式

2021-10-12 17:06:36 字數 3958 閱讀 4337

對於陣列的處理,是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 也會...