leetcode15和leetcode16 講解和python實現
阿新 • • 發佈:2018-11-10
leetcode15 題目
給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
leetcode16 題目
給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1. 與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
為什麼把這兩個題目放在一起
相信在你讀完這兩個題目後,會發現這兩個題目"非常相似"(前者的target=0 後者的targrt=target 都是三個數),同時肯定是需要一定的技巧的,是不能暴力求解的
大致說一下解題思路(至於實現細節和邊緣 大家自己看我的程式哈)
我們可以先對陣列進行排序,如果是計算兩個元素的和的話,我們會分別設定頭和尾兩個指標,向中間靠攏,那麼三個的話,我們只需要先對第一個數進行迴圈取值下標i,剩下的兩個指標分別指向i+1和陣列的最後一個元素,這樣的複雜度是 排序O(nlogn) + 查詢O(n^2) = O(n^2)。
程式解答 (可以直接跑起來)
leetcode 15
class Solution:
@staticmethod
def threeSum(nums):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums=sorted(nums)
print(nums)
ans=[]
isVisted=[]
for i,num_1 in enumerate(nums):
if num_1 in isVisted:
continue
else:
isVisted.append(num_1)
print(num_1)
tmp=set()
j=i+1
k=len(nums)-1
while j<k:
num_2=nums[j]
num_3=nums[k]
sum=num_1+num_2+num_3
if sum==0:
if len(tmp)>=1 and (num_2 in tmp):
pass
else:
ans.append([num_1,num_2,num_3]) #沒有最小的
tmp.add(num_1)
tmp.add(num_2)
tmp.add(num_3)
j+=1
k-=1
elif sum<0:
j+=1
else:
k-=1
return ans
if __name__=="__main__":
print(Solution.threeSum([0,0,0,0]))
leetcode 16
class Solution:
@staticmethod
def threeSumClosest(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums=sorted(nums)
flag=0
ans=0
for i,num_1 in enumerate(nums):
j=i+1
k=len(nums)-1
while j<k:
num_2=nums[j]
num_3=nums[k]
sum=num_1+num_2+num_3
if flag==0:
flag=1
ans=sum
if abs(sum-target)<abs(ans-target):
ans=sum
if sum==target:
return ans #沒有最小的
elif sum<target:
j+=1
else:
k-=1
return ans
if __name__=="__main__":
print(Solution.threeSumClosest([-1,2,1,-4],1))