演算法 高階演算法

2021-09-24 11:05:01 字數 1993 閱讀 9593

三數之和 3sum

第十一章 33

給出乙個有 n 個整數的陣列 s,在 s 中找到三個整數 a, b, c,找到所有使得 a + b + c = 0 的三元組。

注意事項:在三元組(a, b, c),要求 a <= b <= c,結果不能包含重複的三元組。

樣例:如 s = , 你需要返回的三元組集合的是:

(-1, 0, 1)、(-1, -1, 2)

// an highlighted block

class

solution

(object)

: def threesum

(self, nums)

: nums.

sort()

# print

(nums)

result =

i =0while i <

len(nums)-2

: j = i +

1 k =

len(nums)-1

while j < k:

l =[nums[i]

, nums[j]

, nums[k]]if

sum(l)==0

: result.

(l) j +=

1 k -=

1while j < k and nums[j]

== nums[j -1]

: j +=

1while j < k and nums[k]

== nums[k +1]

: k -=

1 elif sum

(l)>0:

k -=

1else

: j +=

1 i +=

1while i <

len(nums)

-2 and nums[i]

== nums[i -1]

: i +=

1return result

if __name__ ==

"__main__"

: a =

solution()

b =[-

1,0,

1,2,

-1,-

4]print

(a.threesum

(b))

解題思路:

求乙個列表中所有和為零的二元組的一種思路是先把列表排序,再用兩個指標從兩頭向中間移動。如果前後兩個數的和小於 0,則左指標右移;如果和大於 0,則右指標左移。求三元組時可以參考這種做法,第乙個數 a 確定後,可以理解為求列表中和為-a 的二元組。由於不要考慮重複的元組,遇到重複的數可以直接跳過。

----2020/3/12

----線性表如果要頻繁的執行插入和刪除操作,該線性表採取的儲存結構應該是()

正確答案: c

雜湊順序

鏈式索引

解析:a,雜湊更適合查詢,不適合頻繁更新

b,順序儲存插入和刪除都需要移動大量元素

c,鏈式儲存適合插入和刪除操作

d,索引結構,每次插入和刪除都需要更新索引,費時

----關於 0 - 1 揹包問題以下描述正確的是( )。

正確答案: d

可以使用貪心演算法找到最優解

能找到多項式時間的有效演算法

使用教材介紹的動態規劃方法可求解任意0-1揹包問題

對於同一揹包與相同的物品,做揹包問題取得的總價值一定大於等於做0-1揹包問題

解析:揹包問題可以把東西拆開選取價值比高的裝包,0-1揹包問題對所裝物品只有都裝和都不裝,所以揹包問題取得的總價值一定大於等於0-1揹包問題。

演算法高階之回溯演算法

1 什麼是回溯法 回溯法實際是窮舉演算法,按問題某種變化趨勢窮舉下去,如某狀態的變化用完還沒有得到最優解,則返回上一種狀態繼續窮舉。回溯法有 通用的解題法 之稱,其採用了一種 走不通就掉頭 思想作為其控制結構,用它可以求出問題的所有解和任意解。它的應用很廣泛,很多演算法都用到回溯法,例如,迷宮,八皇...

其他高階演算法

1.普里姆演算法 prim 演算法 圖論中的一種演算法,可在加權連通圖里搜尋最小生成樹。意即由此演算法搜尋到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點 英語 vertex graph theory 且其所有邊的權值之和亦為最小。2 克魯斯卡爾演算法 求加權連通圖 的最小生成樹的演算法 kru...

Verilog演算法高階

verilog演算法入門 只是介紹一些寫 時的基本思路,但是,一上來就寫 的,往往很難寫出來。接下來,介紹一下較為正規的流程。做演算法時,一般包含以下幾個步驟。需求分析 快速原型驗證 編排框架 編寫 演算法驗證 演算法優化 保護智財權 撰寫文件。這些步驟不一定要遵守,在實際的工程當中,可以視具體情況...