弱雞演算法結構leetcode刷題(1)陣列

2021-09-26 12:41:29 字數 2283 閱讀 9833

原題

1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

class solution:

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

if not nums:

return

length=len(nums)

for i in range(length):

for j in range (i+1,length):

if nums[i]+nums[j]==target:

return [i,j]

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]暴力法搜尋為 o(n^3)o(n 

3) 時間複雜度,可通過雙指標動態消去無效解來優化效率。

雙指標法鋪墊: 先將給定 nums 排序,複雜度為 o(nlogn)o(nlogn)。

雙指標法思路: 固定 33 個指標中最左(最小)數字的指標 k,雙指標 i,j 分設在陣列索引 (k, len(nums))(k,len(nums)) 兩端,通過雙指標交替向中間移動,記錄對於每個固定指標 k 的所有滿足 nums[k] + nums[i] + nums[j] == 0 的 i,j 組合:

當 nums[k] > 0 時直接break跳出:因為 nums[j] >= nums[i] >= nums[k] > 0,即 33 個數字都大於 00 ,在此固定指標 k 之後不可能再找到結果了。

當 k > 0且nums[k] == nums[k - 1]時即跳過此元素nums[k]:因為已經將 nums[k - 1] 的所有組合加入到結果中,本次雙指標搜尋只會得到重複組合。

i,j 分設在陣列索引 (k, len(nums))(k,len(nums)) 兩端,當i < j時迴圈計算s = nums[k] + nums[i] + nums[j],並按照以下規則執行雙指標移動:

當s < 0時,i += 1並跳過所有重複的nums[i];

當s > 0時,j -= 1並跳過所有重複的nums[j];

當s == 0時,記錄組合[k, i, j]至res,執行i += 1和j -= 1並跳過所有重複的nums[i]和nums[j],防止記錄到重複組合。

複雜度分析:

時間複雜度 o(n^2)o(n 

2):其中固定指標k迴圈複雜度 o(n)o(n),雙指標 i,j 複雜度 o(n)o(n)。

空間複雜度 o(1)o(1):指標使用常數大小的額外空間。 詳解

class solution:

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

nums.sort()

res, k = , 0

for k in range(len(nums) - 2):

if nums[k] > 0: break # 1. because of j > i > k.

if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.

i, j = k + 1, len(nums) - 1

while i < j: # 3. double pointer

s = nums[k] + nums[i] + nums[j]

if s < 0:

i += 1

while i < j and nums[i] == nums[i - 1]: i += 1

elif s > 0:

j -= 1

while i < j and nums[j] == nums[j + 1]: j -= 1

else:

i += 1

j -= 1

while i < j and nums[i] == nums[i - 1]: i += 1

while i < j and nums[j] == nums[j + 1]: j -= 1

return res

演算法 LeetCode刷題

given 1,3 2,6 8,10 15,18 return 1,6 8,10 15,18 關鍵就是a 1 b 0 也就是array i 1 1 array i 0 const merge array return array console.log merge 1,3 8,10 2,6 15,1...

leetcode刷題 演算法思想

167 兩數之和 ii 輸入有序陣列 input numbers target 9output index1 1,index2 2我的弱智解法 全部遍歷一遍 class solution return array 優質解法 使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素...

LeetCode刷題 演算法篇

暴力解法 class solution def twosum self,nums list int target int list int i 0 while i j i 1 while j if nums i nums j target return i,j j 1i 1 return none ...