zoukankan      html  css  js  c++  java
  • LeetCode 18. 四数之和

    题目链接

    18. 四数之和

    题目分析

    这个题没啥好说的,就是四数之和拆分成三数之和,然后三数之和固定一个边界值,在剩下的部分利用双指针寻找符合条件的值即可。
    这个题主要是可以优化的地方很多,很多剪枝的地方还学不会,第一次做出来只击败了10%的人,慢的可怜,后来加入了最小值和最大值的判断,把整个算法优化到击败60%的人。

    代码实现

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            List<List<Integer>> res = new ArrayList<>();
            if(nums.length < 4){
                return res;
            }
            Arrays.sort(nums);
            //如果最小值比target大或者最大值比target小,说明不存在这种四数之和,直接返回
            int minValue = nums[0] + nums[1] + nums[2] + nums[3];
            int maxValue = nums[nums.length - 1] + nums[nums.length - 2] + nums[nums.length - 3] + nums[nums.length - 4];
            if (minValue > target || maxValue < target) {
                return res;
            }
            int i = 0;
            while(i < nums.length - 3){
                int j = i + 1;
                while(j < nums.length - 2){
                    int num = target - nums[i] - nums[j];
                    int left = j + 1;
                    int right = nums.length - 1;
                    while(left < right){
                        if(nums[left] + nums[right] < num){
                            int temp = nums[left];
                            while(left < nums.length - 1 && nums[left]  == temp){
                                left++;
                            }
                        }else if(nums[left] + nums[right] > num){
                            int temp =  nums[right];
                            while(right > left && nums[right] == temp){
                                right--;
                            }
                        }else if(nums[left]  + nums[right] == num){
                            List<Integer> list = new ArrayList<>();
                            list.add(nums[i]);
                            list.add(nums[j]);
                            list.add(nums[left]);
                            list.add(nums[right]);
                            res.add(list);
                            int temp = nums[left];
                            while(left < nums.length - 1 && nums[left]  == temp){
                                left++;
                            }
                            temp = nums[right];
                            while(right > left && nums[right] == temp){
                                right--;
                            }
                        }
                    }
                    int temp = nums[j];
                    while(j < nums.length - 2 && nums[j] == temp){
                        j++;
                    }
                }
                int temp = nums[i];
                while(i < nums.length - 3 && nums[i] == temp){
                    i++;
                }
            }
            return res;
        }
    }
    
  • 相关阅读:
    浅尝辄止——在C++中调用C#的回调函数——COM方式
    代码管理——如何连接Git Server,下载代码
    浅尝辄止——使用ActiveX装载WPF控件
    软件调试——CPU异常列表
    软件调试——IA-32 保护模式下寄存器一览
    Delphi面向对象编程
    看雪2017CTF第二题解法
    串操作指令
    MASM 重复汇编
    MASM 宏结构
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13369368.html
Copyright © 2011-2022 走看看