我自己做了一上午还是有错误,参考了别人的,一目了然。
双指针!!!
class Solution: def fourSum(self, nums, target: int): n = len(nums) if n < 4: return [] nums.sort() res = [] for i in range(n-3): # 防止重复 数组进入 res if i > 0 and nums[i] == nums[i-1]: continue # 当数组最小值和都大于target 跳出 if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target: break # 当数组最大值和都小于target,说明i这个数还是太小,遍历下一个 if nums[i] + nums[n-1] + nums[n-2] + nums[n-3] < target: continue for j in range(i+1,n-2): # 防止重复 数组进入 res if j - i > 1 and nums[j] == nums[j-1]: continue # 同理 if nums[i] + nums[j] + nums[j+1] + nums[j+2] > target: break # 同理 if nums[i] + nums[j] + nums[n-1] + nums[n-2] < target: continue # 双指针 left = j + 1 right = n - 1 while left < right: tmp = nums[i] + nums[j] + nums[left] + nums[right] if tmp == target: res.append([nums[i],nums[j],nums[left],nums[right]]) while left < right and nums[left] == nums[left+1]: left += 1 while left < right and nums[right] == nums[right-1]: right -= 1 left += 1 right -= 1 elif tmp > target: right -= 1 else: left += 1 return res
执行用时 :96 ms, 在所有 Python3 提交中击败了99.30%的用户
内存消耗 :13.8 MB, 在所有 Python3 提交中击败了11.17%的用户
——2019.10.8
套用三数之和完成;
public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> lists = new ArrayList<>(); int len = nums.length; for(int i = 0;i<len;i++){ if(i > 0 && nums[i] == nums[i-1]){ continue; } threeSum(nums,i,target-nums[i],nums[i],lists,len); } return lists; } public List<List<Integer>> threeSum(int[] nums,int t ,int target,int nums1,List<List<Integer>> lists,int len) {//三数之和, for(int i = t+1;i<len-2;i++){ if(i>t+1 && nums[i] == nums[i-1]){ continue; } int k = len - 1; for(int j = i+1;j<len-1;j++){ if(j>i + 1 && nums[j] == nums[j-1]){ continue; } while(k>j && nums[j] + nums[k] > target - nums[i]){ k--; } if(k == j){ break; } if(nums[i] + nums[j] + nums[k] == target){ List<Integer> list = new ArrayList<>(); list.add(nums1); list.add(nums[i]); list.add(nums[j]); list.add(nums[k]); lists.add(list); } } } return lists; }
——2020.7.9