哈哈,繼續(xù)在前兩天的基礎之上,4 Sum問題
https://leetcode-cn.com/problems/4sum/description/
對于這種列表的題目,繼續(xù)要排個序,開始想過類似分治的方法,但好像路走不通,那么本著解決問題的思路,就先繼續(xù)“退化”的路,這里就是通過循環(huán),把4Sum變成了3Sum,然后再變成2Sum,基于排序,那么就可以用雙指針法。
原本寫出來之后,以為會超時,但沒想到竟然低分飄過了。
現(xiàn)在回過來看,應該還是有不少可以優(yōu)化的地方,這個計劃就留到周末去吧,平時工作日就先爭取刷一道題,就理解一種思路,順便繼續(xù)熟悉了Python的代碼range的用法,對于一個寫慣了Java的人來說,這種基于range的循環(huán)還是需要適應下。
盡管貢獻了一個效率比較低的代碼,但實際就可讀性和理解方面還是比較清晰的【好吧,其實就是算法比較挫啦】
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
ret = set()
for i in range(len(nums)-3):
for j in range(i+1,len(nums)-2):
t = -(nums[i] + nums[j])+target
l = j+1
r = len(nums)-1
while l<r:
two_sum = nums[l] + nums[r]
if two_sum == t:
ret.add((nums[i],nums[j],nums[l],nums[r]))
l+=1
r-=1
elif two_sum < t:
l+=1
elif two_sum > t:
r-=1
return list(ret)