首页 > 其他分享 >【LeetCode Hot 100】15. 三数之和

【LeetCode Hot 100】15. 三数之和

时间:2024-09-22 11:34:51浏览次数:11  
标签:prime nums 三数 sum Hot 三元组 lt 数组 100

题目描述

回忆一下之前做过的两数之和,用的是哈希表存储已经遍历过的元素。但是本题要求返回值中不能有重复元素,因此需要去重,强行用哈希表的话,去重操作会很复杂。

我们可以通过哪些方法来保证返回的数组中不包含重复的三元组?

  1. 先将整个数组进行排序,可以保证答案数组中有\((a,b,c)\)(其中\(a \le b \le c\))且\((b,a,c)\)或\((c,a,b)\)这样的三元组不会同时出现在答案数组中。
  2. 跳过相同的元素(排序之后这样的元素是相邻的),比如如果数组的排列是\(\dots, a, b, c, c. \dots\),将\((a,b,c)\)加入答案后下一个三元组仍然是\((a,b,c)\),仍然满足要求,如果我们跳过相同的元素,这样的重复情形就不会出现在答案中。

看到这个题,最简单粗暴的想法依旧是使用三重循环进行逐个遍历,但是这种方法的时间复杂度为\(O(N^3)\),很容易超时。那么我们就需要对其进行优化。要找到满足nums[i] + nums[j] + nums[k] = 0的所有三数组合,对于每个固定的元素nums[k]k可以作为最外层循环从头到尾进行遍历),相当于找到和确定为0 - nums[k]的两个数。要在循环内部找到这两个数,能否通过双重循环以外的方式呢?我们可以使用双指针,将两个指针分别设置在k+1位置和数组的最后一个位置,当三数之和sum == 0时,说明我们找到了一个正确的三元组,加入答案数组中;当sum < 0时,说明nums[i] + nums[j] < -nums[k],需要把这两数之和增大,由于数组已经排好序,我们就应该把左边的指针向右移动一格(当然此过程需要跳过重复元素);当sum > 0时,情况类似,需要把右边的指针向左移动。

这种方法的正确性是如何得来的呢?考虑这种情况,某一时刻的三元组\((k,i,j)\)表示此时正在检查的三个数的下标,\(k\)在外层循环,对于内层来说是固定的,如果三数之和\(S \gt 0\),我们把\(j\)减小直到\(j\prime\)停下来,说明\(n_k + n_i + n_{j\prime} \le 0\)而当\(j\prime \lt j \lt len\)时,都有\(S \gt 0\),如果我们再把\(i\)向右移动,那么\(n_i\)只会更大,加上\(j\prime \lt j \lt len\)的\(n_j\),三数之和\(S\)也会更大,自然也大于\(0\),所以我们可以说\(j\prime \lt j \lt len\)这段区间的\(j\)已经被我们排除了,所以我们才可以放心地同时移动双指针。

// Java
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for (int k = 0; k < nums.length - 2; k++) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int i = k + 1, j = nums.length - 1;
            while (i < j) {
                int sum = nums[k] + nums[i] + nums[j];
                if (sum < 0) {
                    while (i < j && nums[i] == nums[++i]) ;
                } else if (sum > 0) {
                    while (i < j && nums[j] == nums[--j]) ;
                } else {
                    res.add(new ArrayList<Integer>(Arrays.asList(nums[k], nums[i], nums[j])));
                    while (i < j && nums[i] == nums[++i]) ;
                    while (i < j && nums[j] == nums[--j]) ;
                }
            }
        }
        return res;
    }
}

标签:prime,nums,三数,sum,Hot,三元组,lt,数组,100
From: https://www.cnblogs.com/louistang0524/p/18425102

相关文章

  • Photoshop安装
    Photoshop安装点击安装包破解选择路径C:\ProgramFiles\Adobe\AdobePhotoshopCC2018安装完成移动安装的ps到其他磁盘,复制粘贴到其他路径即可......
  • 【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓
    系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接5.板子调试6.程序设计7.算法学习8.编写exe9.检测标准10.项目举例11.职业规划文章目录方案一、改DMA中断方案二、改数据类型方案三、改数据长度后记方案一、改DMA中断每个DMA通道都可以在DMA传......
  • 求1000以内所有恰好能分解成10组两个素数之和
    要求根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组)的偶并依次存入数组a中并在屏幕上打印出来,打印时......
  • 视频监控平台AS-V1000的部门管理功能,实现对部门所属的监控视频摄像头资源的添加、删除
    目录一、部门资源二、视频监控资源管理平台介绍1、AS-V1000介绍2、平台服务器配置说明三、部门资源管理功能介绍1、部门资源结构树2、添加和删除部门的资源(1)手动添加(2)删除资源3、查询资源(1)按部门查询(2)按资源查询4、导出部门资源及其结构(1)导出整个部门资源树(2)导......
  • MBR60100PT-ASEMI适配变频器专用MBR60100PT
    编辑:llMBR60100PT-ASEMI适配变频器专用MBR60100PT型号:MBR60100PT品牌:ASEMI封装:TO-247安装方式:插件批号:最新最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流(IFMS):35......
  • MBR60100PT-ASEMI适配变频器专用MBR60100PT
    编辑:llMBR60100PT-ASEMI适配变频器专用MBR60100PT型号:MBR60100PT品牌:ASEMI封装:TO-247安装方式:插件批号:最新最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正......
  • (LeetCode 热题 100) 199. 二叉树的右视图(递归、深度优先搜索dfs)
    199.二叉树的右视图思路:递归每次都优先右边子树,然后才是左子树。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}......
  • 【hot100-java】【组合总和】
    R8-回溯篇印象题,很基本的回溯classSolution{voidbacktrack(List<Integer>state,inttarget,int[]choices,intstart,List<List<Integer>>ret){//子集和等于target,记录解if(target==0){ret.add(newArrayList<>(state));......
  • 面试面经|大模型算法岗常见面试题100道
    本文提供了一份全面的大模型算法岗位面试题清单,包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点,旨在帮助求职者准备相关技术面试。一、基础篇1、目前主流的开源模型体系有哪些?Transformer体系:由Google提出的Transformer模型及其......
  • CF538H Summer Dichotomy 题解
    自己做的\^w^/。对于\(m\)个限制,我们得到了一个图,若不是二分图则无解,否则对于每个连通块有\([l_1,r_1],[l_2,r_2]\)的限制,表示对于两组的人数限制(注意此处\(1,2\)并不代表组\(1\),\(2\))。不妨令\(n_1\gen_2,(r_1>r_2\operatorname{or}r_1==r_2\operato......