首页 > 其他分享 >18.四数之和

18.四数之和

时间:2023-12-19 11:37:33浏览次数:33  
标签:四数 target nums int 18 list length right

题目

18.四数之和

要求

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • 109 <= nums[i] <= 109
  • 109 <= target <= 109

思路

做了三数之和,使用的排序 + 双指针,那四数之和可以参考三数之和,就是外层加一个循环,注意一点,计算的时候使用 long,因为 int 计算会出现溢出,如下:

public List<List<Integer>> fourSum(int[] nums, int target) {
    Arrays.sort(nums);
    List<List<Integer>> result = new ArrayList<>();
    for (int i = 0; i < nums.length - 3; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        if ((long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
            break;
        }
        if ((long) nums[i] + nums[nums.length - 3] + nums[nums.length - 2] + nums[nums.length - 1] < target) {
            continue;
        }
        List<List<Integer>> list = myThreeSum(nums, target - nums[i], i + 1);
        for (List<Integer> threeList : list) {
            threeList.add(nums[i]);
            result.add(threeList);
        }
    }
    return result;
}

private List<List<Integer>> myThreeSum(int[] nums, long target, int index) {
    Set<List<Integer>> result = new HashSet<>();
    for (int i = index; i < nums.length - 2; i++) {
        if (i > index && nums[i] == nums[i - 1]) {
            continue;
        }
        if ((long) nums[i] + nums[i + 1] + nums[i + 2] > target) {
            break;
        }
        if ((long) nums[i] + nums[nums.length - 2] + nums[nums.length - 1] < target) {
            continue;
        }
        int left = i + 1;
        int right = nums.length - 1;
        while (left < right) {
            if ((long) nums[i] + nums[left] + nums[right] == target) {
                List<Integer> list = new ArrayList<>();
                list.add(nums[i]);
                list.add(nums[left]);
                list.add(nums[right]);
                left ++;
                right --;
                result.add(list);
            } else if (nums[i] + nums[left] + nums[right] > target) {
                right --;
            } else {
                left ++;
            }
        }
    }
    return new ArrayList<>(result);
}

在写的过程中,可以加一些判断减少循环次数,这也是优化的一种。

标签:四数,target,nums,int,18,list,length,right
From: https://www.cnblogs.com/wadmwz/p/17913285.html

相关文章

  • 454.四数相加II
    题目454.四数相加II要求给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0思考过程上来直接暴力破解,四层for循环,结果超时,代码如下:......
  • 【2023-12-18】体感冬天
    20:00一个勇往直前、从不退缩的人绝不会怀疑云彩会从头上掉下来,绝不会想到XieE能胜利,而正义遭到挫败,他认为跌倒是为了爬起,受挫是为了更好的战斗,就寝是为了醒来。                                    ......
  • 2023.12.18
    点击查看代码#include<bits/stdc++.h>#definefifirst#definesesecondusingstd::cin;usingstd::min;usingstd::max;usingstd::cout;usingstd::vector;constexprintM=2e6+5;constexprintINF=0x3f3f3f3f,mod=998244353;......
  • 2023年12月18日总结
    更好的观看总结冬月初六,天气还是很寒冷。好在教室里面开了空调,还是很暖和。一眼今天的内容,技巧与思想?分治、启发式合并、分块算法、莫队算法、CDQ分治、整体二分?难以言表。洛谷首页的做题计划还鸽了好多题啊!做不完啊。先来一道dp的题目。P8820[CSP-S2022]数据传输之前......
  • 20231218
    今天时Java程序设计考试,题目还好,比较麻烦的点就是第二个表的键值很多,审核的流程很好,但是我没有做完。做题的时候遇到了些问题,比如关于部门(Department)的处理,本来是想作为一个实体,但是题目中的部门是固定的,最后为了省事又改成了枚举,关于用户的管理题目中也没有说清楚,是由哪个角色......
  • 20231218
         2022级《JAVA语言程序设计》  上机考试试题                 2022.12.18  考试要求 一、本试卷为2022级《JAVA语言程序设计》上机考试试卷;二.注意编程规范:(1)通过Eclipse添加类的方式建立类;(2)程序开头部分注......
  • 12.18日
      终于迎来了王老师的最终测试,早上也是进行了最后的准备和测试。中午先去到了505教室,但是在教室里发现了几张熟悉的面孔——人工智能的同学,经询问得知他们在505上电工基础课程。而后经调整我们去往了512进行考试,看见王老师的一瞬间也是心安了。王老师总是给人一种稳重成熟的感......
  • 2023.12.18——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JFinal明日计划:学习......
  • 12.18每日总结
    软件设计模式简单分类我们在未正式学习设计模式之前先去简单了解一下设计模式的主要三种分类:创建型模式用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。书中提供了单例、原型、工厂方法、抽象工厂、建造者等5种创建型模式。结构型模式用于描述如......
  • 12月18每日打卡
    实验2熟悉常用的HDFS操作  1.实验目的(1)理解HDFS在Hadoop体系结构中的角色;(2)熟练使用HDFS操作常用的Shell命令;(3)熟悉HDFS操作常用的JavaAPI。2.实验平台(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);(2)Hadoop版本:3.1.3;(3)JDK版本:1.8;(4)JavaIDE:Eclipse。3.实验步骤(一)编......