三數之和
因為是三數之和,所以最直觀的想法就是,用三個迴圈把,所有可能的三數之和算一遍就可以了。
第乙個迴圈定住第乙個數,然後從第二個數從左右到搜尋,從最後乙個數從右到左搜尋。
這裡借鑑老表的分析圖,非常直觀。
**稍微優化了一下,特殊情況
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...