leetcode——18.四数之和

我自己做了一上午还是有错误,参考了别人的,一目了然。

双指针!!!

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

 

posted @ 2019-10-08 16:09  欣姐姐  阅读(157)  评论(0编辑  收藏  举报