python線性表 線性表(二) 順序表的經典例題

2021-10-18 15:35:30 字數 3051 閱讀 6299

引言前文介紹了順序表的基本操作,本文主要來分析有關順序表的經典程式設計題目。

順序表例題

兩數之和

力扣:1. 兩數之和

問題簡述:

題目給定了乙個target,要求在這個整數陣列中找出兩個整數的和恰好等於target,並返回整數的下標。

問題分析:

最簡單的實現方法是列舉法,利用雙層迴圈查詢哪兩個整數恰好和為target,只要查詢到就返回結果,但這樣做會使得平均時間複雜度為o(n^2),效率較低。

正確的做法為設定乙個雜湊表,利用雜湊表預先儲存陣列中元素的值和索引,然後線性掃瞄整個陣列,如果發現雜湊表中存在target-nums[i]的鍵且值不等於i則停止掃瞄,返回結果。

**:class solution:

def twosum(self, nums: list[int], target: int) -> list[int]:

hashtable = {}

for i,j in enumerate(nums):

hashtable[j] = i

for k in range(len(nums)):

s = hashtable.get(target - nums[k])

if s != k and s is not none:

return [k, s]

刪除排序陣列中的重複項

力扣:26. 刪除排序陣列中的重複項

問題簡述:

給定乙個排序陣列,要求使用o(1)空間原地將重複項刪除,並返回刪除重複項後陣列的長度。

問題分析:

本題難點在於將空間複雜度限制在o(1)層次,因此雜湊計數、線性掃瞄等方法在此處無法使用。

由於題目中告知不需要考慮新長度後陣列中的元素,因此我們可以考慮採用雙指標(滑動視窗),將要刪除的元素覆蓋,即可實現重複項刪除操作。

**class solution:

def removeduplicates(self, nums: list[int]) -> int:

if len(nums) <= 1:

return len(nums)

else:

a, b = 0, 1

while b < len(nums):

while b < len(nums) and nums[b] == nums[a]:

b += 1

if b < len(nums):

a += 1

nums[a] = nums[b]

return a + 1

盛最多水的容器

力扣:11. 盛水最多的容器

問題簡述:

給出了寬度(索引之差),以及高度(最小元素值),求出最大矩形面積。

問題分析:

我們可以設定頭尾指標,實時記錄最大的矩形面積,指標更新按照如下規則:

頭指標對應的值更小,則頭指標後退一位;

尾指標對應的值更小,則尾指標前進一位;

頭尾指標對應的值相同,則相向進一位。

**class solution:

def maxarea(self, height: list[int]) -> int:

a, b = 0, len(height)-1

res = 0

while a < b:

res = max(res, min(height[a], height[b])*(b-a))

if height[b] > height[a]:

a += 1

elif height[b] < height[a]:

b -= 1

else:

a += 1

b -= 1

return res

三數之和

力扣:15. 三數之和

問題簡述:

在乙個整數陣列中找出三個元素,這三個元素的和為0,輸出所有滿足條件且不重複的組合。

問題分析:

相信很多人對這道題的第一反應就是三層迴圈直接找出三個數並判斷其和是否等於0,但這樣做的時間複雜度為o(n^3)。

外層迴圈可以得到a的值,第二層迴圈可以得到b的值,不難發現,在a已知的情況下,b和c的值呈線性關係,若b偏大c必定偏小,反之亦然,我們將c通過乙個指標指向陣列尾部,在第二層迴圈中可以判斷,若a+b+c>0,那麼c對應的指標可以向前移動,因為可能成立的c值一定在左側,又因為陣列是公升序排列,b的值只會不斷增大,因此c的值必定呈遞減趨勢。

**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 > 0 and nums[first] == nums[first - 1]:

continue

# c 對應的指標初始指向陣列的最右端

third = n - 1

target = -nums[first]

# 列舉 b

for second in range(first + 1, n):

# 需要和上一次列舉的數不相同

if second > first + 1 and nums[second] == nums[second - 1]:

continue

# 需要保證 b 的指標在 c 的指標的左側

while second < third and nums[second] + nums[third] > target:

third -= 1

# 如果指標重合,隨著 b 後續的增加

# 就不會有滿足 a+b+c=0 並且 b

if second == third:

break

if nums[second] + nums[third] == target:

return ans

鏈式線性表和順序線性表

在這裡插入 片 線性表的儲存結構 typedef struct seqlist typedef struct seqlist 順序表基本操作 初始化順序表在這裡插入 片 intseqlist init seqlist list,int size 插入資料元素在這裡插入 片 intseqlist in...

順序線性表

sequential linear list this file define the ds of sequential linear list s basic operation,it includes linear list insert,delete,initial,and sort oper...

順序線性表

include int const maxsize 100 typedef int element typedef struct list element list get index value list int int main 函式 初始化線性表 void list init list ls ...