首页 > 其他 > 详细

leetcode18

时间:2019-06-29 10:19:23      阅读:225      评论:0      收藏:0      [点我收藏+]

先给出一个使用回溯法,求“组合”,但是这种方案会TLE:

 1 class Solution:
 2     def __init__(self):
 3         self.filter = set()
 4         self.result = []
 5 
 6     def trackBack(self,nums,i,temp,target):
 7         if len(temp) == 4:
 8             cursum = nums[temp[0]] + nums[temp[1]] + nums[temp[2]] + nums[temp[3]]
 9             if cursum == target:
10                 k = (nums[temp[0]] , nums[temp[1]] , nums[temp[2]] , nums[temp[3]])
11                 if k not in self.filter:
12                     self.filter.add(k)
13                     self.result.append([nums[temp[0]] , nums[temp[1]] , nums[temp[2]] , nums[temp[3]]])
14             return
15         for j in range(i,len(nums)):
16             if j not in temp:
17                 temp.append(j)
18                 self.trackBack(nums,j,temp,target)
19                 temp.pop(-1)
20         
21     def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
22         nums = sorted(nums)
23         temp = []
24         self.trackBack(nums,0,temp,target)
25         return self.result

 

下面给出一个AC的参考的答案,

参考地址:https://leetcode.com/problems/4sum/discuss/8545/Python-140ms-beats-100-and-works-for-N-sum-(Ngreater2)

 1 class Solution:
 2     def fourSum(self, nums, target):
 3         nums.sort()
 4         results = []
 5         self.findNsum(nums, target, 4, [], results)
 6         return results
 7 
 8     def findNsum(self, nums, target, N, result, results):
 9         if len(nums) < N or N < 2: return
10 
11         # solve 2-sum
12         if N == 2:
13             l,r = 0,len(nums)-1
14             while l < r:
15                 if nums[l] + nums[r] == target:
16                     results.append(result + [nums[l], nums[r]])
17                     l += 1
18                     r -= 1
19                     while l < r and nums[l] == nums[l - 1]:
20                         l += 1
21                     while r > l and nums[r] == nums[r + 1]:
22                         r -= 1
23                 elif nums[l] + nums[r] < target:
24                     l += 1
25                 else:
26                     r -= 1
27         else:
28             for i in range(0, len(nums)-N+1):   # careful about range
29                 if target < nums[i]*N or target > nums[-1]*N:  # take advantages of sorted list
30                     break
31                 if i == 0 or i > 0 and nums[i-1] != nums[i]:  # recursively reduce N
32                     self.findNsum(nums[i+1:], target-nums[i], N-1, result+[nums[i]], results)
33         return

这题相当于是在两个数的基础上增加两层循环,或是在三个数的基础上增加一层循环,对之前的“基础前置”题目记不住,这道题就很难写出来。

这道题目难度属于Medium,是对于已经掌握了之前的两道题目的人来划分的。

如果做题的人没有之前的基础,没有做过之前那两道题,那就是hard级别了。

leetcode18

原文:https://www.cnblogs.com/asenyang/p/11105539.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!