zoukankan      html  css  js  c++  java
  • 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

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    list count++
    Java程序员常用工具类库
    Java读写Excel之POI超入门
    JS操作JSON总结
    ORACLE RAC 11G 添加以及删除UNDO表空间
    oracle 索引优化之distinct
    Redis常用的命令
    Linux 安装Redis 5.0(以及参数调优)
    OEM12C(12.1.0.5)安装插件监控mysql(linux)
    mysql版本升级
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11635999.html
Copyright © 2011-2022 走看看