1、集合:由乙個或多個確定的元素所構成的整體。集合裡的元素型別不一定相同,集合裡的元素沒有順序。
2、陣列:陣列會用一些名為索引
的數字來標識每項資料在陣列中的位置。陣列中的元素在記憶體中是連續儲存的,且每個元素占用相同大小的記憶體。
對於陣列,計算機會在記憶體中申請一段連續的空間,並且會記下索引為0
處的記憶體位址。
這就意味著只要計算出陣列中元素的記憶體位址,則可以一步訪問到陣列中的元素,時間複雜度為 o(1)。
(2)查詢元素: 計算機只會儲存陣列中索引為0
處元素的記憶體位址,因此當計算機想要知道陣列中是否包含某個元素時,只能從索引0
處開始,
逐步向後查詢。時間複雜度為 o(n),n為陣列的長度。
(3)插入元素:如果要將該元素插入到陣列的末尾,只需要一步。即計算機通過陣列的長度和位置計算出即將插入元素的記憶體位址,然後將該元素插入到指定位置即可。
如果要將該元素插入到陣列中的其他位置,則會有所區別,這時我們首先需要為該元素所要插入的位置騰出
空間,然後進行插入操作。
(4)刪除元素:刪除元素與插入元素的操作類似,當我們刪除掉陣列中的某個元素後,陣列中會留下空缺
的位置,而陣列中的元素在記憶體中是連續的,
這就使得後面的元素需對該位置進行填補
操作。
4、字串簡介: 字串是由零個或多個字元組成的有限序列,字串的基本操作物件通常是字串整體或者其子串。
陣列練習題:
(3):合併區間
defmerge(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):翻轉矩陣
defrotate(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)字串最長公共字首
deff(strs):
res =""
for i in zip(*strs):
if len(set(i))==1:
res +=i[0]
else
:
break
return res
6、雙指標使用場景一:從兩端向中間迭代陣列。使用技巧:乙個指標從頭部開始,而另乙個指標從尾部開始。
(1)翻轉陣列
deff(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開始
deff(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的個數
deff(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
deff(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 流程中的不同階段的直接比較成為可能,因為這時候審計人員 或者程式設計師 可以簡單的...