4數之和and N數之和
阿新 • • 發佈:2018-11-21
4數之和題目描述:
給定一個包含 n 個整數的陣列 nums
和一個目標值 target
,判斷 nums
中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target
相等?找出所有滿足條件且不重複的四元組。
注意:
答案中不可以包含重複的四元組。
示例:
給定陣列 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 滿足要求的四元組集合為: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
結合之前3數之和的思想,多加了一個用於迴圈求4數之和,結果超出了時間限制。別人的方法寫了兩個函式,其中一個需要遞迴,可以直接計算Ñ數之和,簡直不要太厲害,也解決了我的疑問如果5個數6個數7個數的時候總不能還是這個思路吧.....下面給出自己的病態程式碼,以及別人家的程式碼!!!
我
class Solution: def fourSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[List[int]] """ nums.sort() length = len(nums) num = [] if length<4: return num elif length == 4: if nums[0]+nums[1]+nums[2]+nums[3] == target: num.append([nums[0], nums[1], nums[2], nums[3]]) return num else: return num for i in range(0 , length - 3): tag = target - nums[i] for j in range(i + 1 , length - 2): l = j + 1 r = length -1 while l<r: sum = nums[j] + nums[l] + nums[r] if sum > tag: r = r - 1 elif sum < tag: l = l + 1 else: if [nums[i],nums[j],nums[l],nums[r]] not in num: num.append([nums[i],nums[j],nums[l],nums[r]]) l = l + 1 r = r - 1 return num
Ñ個數之和:(findNsum函式裡的引數確定多少個數之和)
class Solution: def fourSum(self, nums, target): def findNsum(nums, target, N, cur): if len(nums) < N or N < 2 or nums[0] * N > target: return if N == 2: l , r = 0 , len(nums) - 1 while l < r: s = nums[l] + nums[r] if s == target: res.append(cur + [nums[l] , nums[r]]) while l < r and nums[l] == nums[l + 1]: l += 1 while l < r and nums[r] == nums[r - 1]: r -= 1 l += 1 r -= 1 elif s < target: l += 1 else: r -= 1 else: for i in range(len(nums) - N + 1): if i == 0 or nums[i - 1] != nums[i]: findNsum(nums[i + 1 :],target - nums[i], N - 1, cur + [nums[i]]) res = [] findNsum(sorted(nums),target,4,[]) return res