leetcode 資料結構 探索陣列和字串

2022-07-24 18:57:08 字數 4904 閱讀 6392

1、集合:由乙個或多個確定的元素所構成的整體。集合裡的元素型別不一定相同,集合裡的元素沒有順序。

2、陣列:陣列會用一些名為索引的數字來標識每項資料在陣列中的位置。陣列中的元素在記憶體中是連續儲存的,且每個元素占用相同大小的記憶體。

對於陣列,計算機會在記憶體中申請一段連續的空間,並且會記下索引為0處的記憶體位址。

這就意味著只要計算出陣列中元素的記憶體位址,則可以一步訪問到陣列中的元素,時間複雜度為 o(1)。

(2)查詢元素:   計算機只會儲存陣列中索引為0處元素的記憶體位址,因此當計算機想要知道陣列中是否包含某個元素時,只能從索引0處開始,

逐步向後查詢。時間複雜度為 o(n),n為陣列的長度。

(3)插入元素:如果要將該元素插入到陣列的末尾,只需要一步。即計算機通過陣列的長度和位置計算出即將插入元素的記憶體位址,然後將該元素插入到指定位置即可。

如果要將該元素插入到陣列中的其他位置,則會有所區別,這時我們首先需要為該元素所要插入的位置騰出空間,然後進行插入操作。

(4)刪除元素:刪除元素與插入元素的操作類似,當我們刪除掉陣列中的某個元素後,陣列中會留下空缺的位置,而陣列中的元素在記憶體中是連續的,

這就使得後面的元素需對該位置進行填補操作。

4、字串簡介:  字串是由零個或多個字元組成的有限序列,字串的基本操作物件通常是字串整體或者其子串。

陣列練習題:

(3):合併區間

def

merge(intervals):

intervals.sort(key=lambda

x: x[0])

merge =

for interval in

intervals:

ifnot merge or merge[-1][1]else

: merge[-1][1]=max(merge[-1][1],interval[1])

return

merge

"""intervals=[[1,4],[4,5],[6,8]]

merge=

for 迴圈:

step 1: merge=[[1,4]]

step 2: merge[-1][1]=interval[0]

merge[-1][1]=max(merge[-1][1],interval[1])=5

merge=[[1,5]]

step3: merge[-1][1]=5"""

4、二維陣列:二維陣列是一種結構較為特殊的陣列,只是將陣列中的每個元素變成了一維陣列。二維陣列的本質上仍然是乙個一維陣列,內部的一維陣列仍然從索引0開始,我們可以將它看作乙個矩陣,並處理矩陣的相關問題。

(4):翻轉矩陣

def

rotate(matrix):

n =len(matrix)

#新建乙個n*n的輔助矩陣

new_matrix= = [[0]*n for _ in

range(n)]

#行row

for i in

range(n):

#列col

for j in

range(n):

#矩陣中第i行的第j個元素,在旋轉後,它出現在倒數第i列的第j個位置

new_matrix[j][n-i-1]=matrix[i][j]

#淺拷貝

matrix[:] = new_matrix

(5)矩陣清0:若m × n矩陣中某個元素為0,則將其所在的行與列清零。

x = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]

row_length =len(x)

col_length =len(x[0])

#儲存需要清0行與列

row =[ ]

col =[ ]

#row

for i in

range(row_length):

#col

for j in

range(col_length):

if x[i][j]==0:

#對row清0

for i in

row:

for j in

range(col_length):

x[i][j]=0

#對col清0

for j in

col:

for i in

range(row_length):

x[i][j]=0

print(x)

字串練習題:(1)字串最長公共字首

def

f(strs):

res =""

for i in zip(*strs):

if len(set(i))==1:

res +=i[0]

else

:

break

return res

6、雙指標使用場景一:從兩端向中間迭代陣列。使用技巧:乙個指標從頭部開始,而另乙個指標從尾部開始。

(1)翻轉陣列

def

f(s):

i =0

j = len(s)-1

while is[i],s[j] =s[j],s[i]

i +=1j -=1

return

s

s = ['

l', '

e', '

e', '

t', '

c', '

o', '

d', 'e'

]print(f(s))

(2)給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數.函式應該返回這兩個下標值index1 和 index2,其中 index1 必須小於 index2。且index不從0開始

def

f(nums,target):

n =len(nums)

i =0

j = n-1

while isum = nums[i]+nums[j]

if sum==target:

return [i+1,j+1]

elif sumi +1

else

: j -=1nums = [2, 7, 11, 15]

target =9

print(f(nums,target))

:7、雙指標使用場景二:快慢指標。確定兩個指標的移動策略,有時可能需要在使用雙指標技巧之前對陣列進行排序,也可能需要運用貪心法則來決定你的運動策略。

例題(1)給你乙個陣列nums和乙個值val,你需要 原地 移除所有數值等於val的元素,並返回移除後陣列的新長度。

#

快慢指標移動策略:當快指標指向的值不等與給定值時,滿指標移動。

defremoveelement(nums,val):

n=len(nums)

slow =0

for fast in

range(n):

if nums[fast]!=val:

nums[slow]=nums[fast]

slow +=1

return slow

(2)給定乙個二進位制陣列, 計算其中最大連續1的個數

def

f(nums):

if 1 not

innums:

return

0

else

: n =len(nums)

slow =0

x =for fast in

range(n):

if nums[fast]==1:

else

: slow =0

return max(x)

(3)給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的連續子陣列,並返回其長度。如果不存在符合條件的連續子陣列,返回 0

def

f(nums,s):

n =len(nums)

#初始化

左指標 left =0

#初始化最小長度:正無窮。即陣列中所有元素累計和小於s

res = float("

inf"

)

#初始化陣列中元素累和

temp =0

#右指標 r

for right in

range(n):

temp +=nums[right]

#進入迴圈的條件:元素累和》=s

while (temp>=s):

#記錄此時最小長度

res = min(res, right-left+1)#

right-left+1代表左指標到右指標的長度

temp -=nums[left]#

滑動視窗的原則:先進先出。當元素累和超過s時,從左側吐掉元素。

left +=1

if res !=float("

inf"

):

return

res

else

:

return

0

nums =[2,3,1,2,4,3]

s = 7

print(f(nums,s))

leetcode 資料結構 探索雜湊表

1 雜湊表 雜湊表是一種使用雜湊函式組織資料,以支援快速插入和搜尋的資料結構。通過選擇合適的雜湊函式,雜湊表可以在插入和搜尋方面實現出色的效能。雜湊表的關鍵思想是使用雜湊函式將鍵對映到儲存桶。1 雜湊集合 集合資料結構的實現之一,用於儲存非重複值。2 雜湊對映 對映資料結構的實現之一,用於儲存 ke...

資料結構 資料結構探索(一) 樹的綜述

最近研究了mysql的索引結果,mysql的索引結果是使用了b tree的資料結構,了解了結構以後,對索引的功能和使用的一些規則就有了更加深入的了解,原來只是死記硬背規則和策略,現在感覺能知道背後到底是因為什麼。之後因為看到了set物件的元素存入方式,treeset使用的是紅黑樹儲存,來保證元素不會...

數倉 資料結構

一 集結區 staging area 資料的集結過程指的是寫入磁碟 二 集結目的 可恢復 備份 審計 很多時候,源系統和目標系統之間的資料沿襲在 etl 中丟失,當審計 etl 流程時,資料集結區的存在使得對 etl 流程中的不同階段的直接比較成為可能,因為這時候審計人員 或者程式設計師 可以簡單的...