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

    给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c和d,适合a+b+c+d的值与target相等?找出所有满足条件且不重复的四元组。

    与三数之和一样的思路。前两个数两个循环,后两个数用指针遍历的方式。在整体循环框架、指针遍历码好后,要添加条件来增加遍历速度,以及去重。

    • 如果输入数组不满4个,则可以直接返回空字符串
    • 在i循环时,可以判断是否nums[i]和nums[i-1]相等,相等就可以跳过,因为这种情况遍历过
    • 在i循环时,也可以判断是否最小的四个数之和已经大于target,如果大于,说明后面更不可能满足,可以直接结束循环,返回结果
    • 同理,在j循环,也要判断是否存在nums[j]和nums[j-1]相等的情况
    • 在指针遍历的适合,也要判断是否L和R指针下各自与附近的数相等

    提交代码

    import java.util.*;
    import static java.lang.Math.min;
    
    public class leetcode {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            int n = scan.nextInt();
            String str = scan.nextLine();
            int[] nums = new int[n];
            for(int i = 0; i < n; i++) {
                nums[i] = scan.nextInt();
            }
            int target = scan.nextInt();
            List result = fourSum(nums, target);
            System.out.println(result);
        }
    
        public static List<List<Integer>> fourSum(int[] nums, int target) {
            List<List<Integer>> ans = new ArrayList<>();
            int len = nums.length;
            if(nums == null || len < 4) return ans;
            Arrays.sort(nums);
            for(int i = 0; i<len-3 ; i++) {
                if( i>0 && nums[i] == nums[i-1]) continue;
                if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target) break;
                for(int j = i+1; j<len-2; j++) {
                    if( j>i+1 && nums[j] == nums[j-1]) continue;
                    int L = j + 1;
                    int R = len - 1;
                    while(L < R) {
                        int sum = nums[i] + nums[j] + nums[L] + nums[R];
                        if(sum == target) {
                            ans.add(Arrays.asList(nums[i],nums[j],nums[L],nums[R]));
                            while (L < R && nums[L] == nums[L+1]) L++;
                            while (L < R && nums[R] == nums[R-1]) R--;
                            L++;
                            R--;
                        }
                        else if (sum - target < 0) L++;
                        else if (sum - target > 0) R--;
                    }
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    Self referencing loop detected for property 错误
    路径 序列化
    css基础回顾
    React 随笔二
    Reactnative 随笔一
    值类型和引用类型 装箱和拆箱 类和结构的异同 接口抽象类异同
    多语言配置--LogisticsPlatform物流平台系统
    word-wrap&&word-break,奇偶行、列设置样式
    easyUI 的tree 修改节点,sql递归查询
    跳转页面,传递参数——android
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/12641326.html
Copyright © 2011-2022 走看看