首页 > 其他分享 >15. 三数之和

15. 三数之和

时间:2023-12-19 11:37:44浏览次数:29  
标签:right 15 nums int 三数 三元组 result left

题目

15. 三数之和

要求

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • 105 <= nums[i] <= 105

思考

三数之和,先借用两数之和的思路,看看如下代码:

public List<List<Integer>> threeSum(int[] nums) {
    Set<List<Integer>> result = new HashSet<>();
    for (int i = 0; i < nums.length; i++) {
				// 重复判断,减少了 while 循环的次数
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        List<List<Integer>> list = myTwoSum(nums, -nums[i], i);
        for (int j = 0; j < list.size(); j++) {
            list.get(j).add(nums[i]);
            // 排序,外部 set 去重
            Collections.sort(list.get(j));
        }
        if (!list.isEmpty()) {
            result.addAll(list);
        }
    }
    return new ArrayList<>(result);
}

private List<List<Integer>> myTwoSum(int[] nums, int target, int index) {
    List<List<Integer>> result = new ArrayList<>();
    HashSet<Integer> set = new HashSet<>();
    for (int i = index + 1; i < nums.length; i++) {
        if (set.contains(target - nums[i])) {
            List<Integer> temp = new ArrayList<>();
            temp.add(nums[i]);
            temp.add(target - nums[i]);
            result.add(temp);
        }
        set.add(nums[i]);
    }
    return result;
}

这个写法只能说正确,但是效率就不多说呢,能通过。

继续思考,数组的题目,可以想想排序,排序 + 双指针呢?双指针的的思路是在排序的基础上才可以实现的,排序之后遍历每一位,双指针分别是当前遍历的下一位和最后一位,和大于 0 移动 right,和小于 0 移动 left,等于 0 就记录,代码如下:

public List<List<Integer>> threeSum(int[] nums) {
    Set<List<Integer>> result = new HashSet<>();
    Arrays.sort(nums);
    for (int i = 0; i < nums.length; i++) {
        // 重复判断,减少了 while 循环的次数
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        int left = i + 1;
        int right = nums.length - 1;
        while (left < right) {
            if (nums[i] + nums[left] + nums[right] == 0) {
                result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                left ++;
                right --;
            } else if (nums[i] + nums[left] + nums[right] > 0) {
                right --;
            } else {
                left ++;
            }
        }
    }
    return new ArrayList<>(result);
}

三数之和可以这么做,那四数之和呢?

标签:right,15,nums,int,三数,三元组,result,left
From: https://www.cnblogs.com/wadmwz/p/17913278.html

相关文章

  • springboot015粮食仓库管理系统(毕业设计,附数据库和源码)
    一.4开发的技术介绍一.4.1Springboot介绍一.4.2Java语言一.4.3MySQL数据库一.5论文的结构二需求分析二.1需求设计二.2可行性分析二.2.1技术可行性二.2.2经济可行性二.2.3操作可行性二.3功能需求分析表2-1粮食仓库管理系统功能结构图三系统设计三.1数据库概念结构......
  • 12.15
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>房产经纪人页面</title><style>.form{width:600px;margin:0auto;/*bor......
  • 10.15
    虽然SQL是一门ANSI(AmericanNationalStandardsInstitute美国国家标准化组织)标准的计算机语言,但是仍然存在着多种不同版本的SQL语言。然而,为了与ANSI标准相兼容,它们必须以相似的方式共同地来支持一些主要的命令(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。要创......
  • (15-418)Lecture 3 Parallel Programming Abstractions
    抽象VS实现实例:ISPC程序ISPC是一种SPMD(singleprogrammultipledata)编译器。利用ISPC编写的计算sin(x)的程序如下图:ISPC提供了一种抽象,当调用ISPC函数时(即程序中调用sinx的语句),会产生一个gang,这个gang含有多个ISPC实例,每个实例会执行自己的代码,当每个实例都执行完后,恢复原先......
  • 文心一言 VS 讯飞星火 VS chatgpt (159)-- 算法导论12.3 6题
    六、用go语言,当TREE-DELETE中的结点z有两个孩子时,应该选择结点y作为它的前驱,而不是作为它的后继。如果这样做,对TREE-DELETE应该做些什么必要的修改?一些人提出了一个公平策略,为前驱和后继赋予相等的优先级,这样得到了较好的实验性能。如何对TREE-DELETE进行修改来实现这......
  • RS232转profinet网关扫码枪自由口与1500程序对比
    RS232转profinet网关扫码枪自由口与1500程序对比RS232转profinet网关(XD-PNR200)自由口是一种用于将RS232串口信号转换为profinet协议的设备,它具有自由口的功能。本文以某自动化生产线为例进行案例研究。通过RS232转Profinet网关(XD-PNR200),将生产线的多个RS232扫码枪与PLC连接起来,......
  • 12.15
    AGENT/agent.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>房产经纪人页面</title><style>.form{width:600px;margin:0auto;......
  • Educational Codeforces Round 159 (Rated for Div. 2)
    EducationalCodeforcesRound159(RatedforDiv.2)A-BinaryImbalance解题思路:有一对\((0,1)\),那么\(0\)就能无限增长。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10;typedefpair<ll,ll>pii;constllm......
  • Codeforces Round 915 (Div. 2)
    基本情况A题还没进入状态,卡了快10分钟。B题一开始想复杂了,以为是树的直径,后面推出来发现针对叶子数目讨论就行了,正确思路出来太慢了(一个半小时)。C题留了半个多小时,随便口胡了一个LIS思路,但是判断无解没思路。C.LargestSubsequenceProblem-C-Codeforces首先我们把字......
  • 2023-2024-1 20231415 <计算机基础与程序设计》第十二周学习总结
     这个作业属于哪个班级https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12作业目标《C语言程序设计》第11章并完成云班课测试作业正文https://i.cnblogs.com/posts/edit教材......