leetcode 三數之和 白痴講解

2021-09-10 12:45:52 字數 1763 閱讀 2215

三數之和

因為是三數之和,所以最直觀的想法就是,用三個迴圈把,所有可能的三數之和算一遍就可以了。

第乙個迴圈定住第乙個數,然後從第二個數從左右到搜尋,從最後乙個數從右到左搜尋。

這裡借鑑老表的分析圖,非常直觀。

**稍微優化了一下,特殊情況

class solution(object):

def threesum(self, nums):

""":type nums: list[int]

:rtype: list[list[int]]

"""# 用乙個list來儲存nums中滿足條件的三個數

satisfied_list =

# 對nums列表進行排序

nums.sort()

for i in range(len(nums)):

# 如果排序後第乙個數都大於0,則肯定不會有三數之和為0的情況

if nums[i] > 0:

break

# 排序後相鄰兩數如果相等,則跳出當前迴圈,因為相同的數隻需要計算一次

if i > 0 and nums[i] == nums[i-1]:

continue

#還剩下一種最common的情況

if i == 0 or nums[i] > nums[i - 1]:

# 記錄i的下乙個位置

left_number = i + 1

# 最後乙個元素的位置

right_number = len(nums) - 1

while left_number < right_number:

# 判斷三數之和是否為0

if nums[i]+nums[left_number] + nums[right_number] == 0:

# 把結果加入陣列中

# 判斷left_number相鄰數字有沒有相等的,有的話就不需要重複計算

while left_number < right_number and nums[left_number] == nums[left_number + 1]:

left_number += 1

# 同理判斷right_number

while left_number < right_number and nums[right_number] == nums[right_number - 1]:

right_number -= 1

# 如果這三個數沒有相等,則左邊往右移一格left_number + 1,右邊往左移一格right_number - 1

left_number += 1

right_number -= 1

# 三數之和如果小於0

elif nums[i]+nums[left_number] + nums[right_number] < 0:

#那左邊的數可以往右移一格變大試一下

left_number += 1

else:

#如果三數之和大於0

#那就右邊的數往左移一格變小試一下

right_number -= 1

return statisfied_list

leetcode 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 因為這次是要求輸出對應的三...

LeetCode 三數之和

題目描述 給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 題目分析 有序陣...

Leetcode 三數之和

解決方案一 class solution else if nums j nums k target else while i 1 1 i return lllist 解決方案2 class solution 如果有3個0,就直接作為乙個解 if zerosize 3 res.add arrays.a...