首页 > 其他分享 >LeetCode—15. 三数之和(中等)

LeetCode—15. 三数之和(中等)

时间:2024-11-29 10:29:14浏览次数:8  
标签:15 target nums int 三数 sum 三元组 LeetCode 数字

仅供个人学习使用

题目描述:

给你一个整数数组 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 。

题目解析:

本题的重点是去重。

我们先排序,然后固定一个元素nums[i],采用双指针。具体思路如下:

首先对数组进行排序,这样相同的数字会挨在一起,方便后续处理。逐个检查数组中的每个数字。对于每个数字,使用两个指针l和r(一个在当前数字之后,一个在数组末尾)来寻找另外两个数字,使得这三个数字的和为0。如果当前数字与前一个数字相同,跳过以避免找到相同的三元组

双指针移动:在 while 循环中,我们根据 sum(即 nums[l] + nums[r])与 target 的比较结果来移动指针 lr

  • 如果 sum 等于 target,说明我们找到了一个三元组,将其添加到结果列表中。
  • 如果 sum 小于 target,说明我们需要一个更大的和,因此将 l 向右移动,以增加 nums[l] 的值。
  • 如果 sum 大于 target,说明我们需要一个更小的和,因此将 r 向左移动,以减少 nums[r] 的值。

找到一组解后,跳过所有重复的数字,以避免找到重复的三元组。

实现代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //排序
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for(int i = 0; i < nums.length;i++){
            //跳过重复元素
            if(i>0 && nums[i] == nums[i - 1]) continue;

            //双指针
            int l = i + 1,r = nums.length - 1;
            int target = -nums[i];

            while(l < r){
                int sum = nums[l] + nums[r];
                if(sum == target){
                    res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    l++;
                    r--;
                    //跳过重复元素
                    while(l < r && nums[l] == nums[l - 1]) l++;
                    while(l < r && nums[r] == nums[r + 1]) r--;
                }else if(sum < target){
                    l++;
                }else r--;
            }
        }
        return res;
    }
}

标签:15,target,nums,int,三数,sum,三元组,LeetCode,数字
From: https://blog.csdn.net/m0_62909831/article/details/144129296

相关文章

  • iOS 升级到XCode15运行项目导致XCode闪退
    XCode升级到15之后运行现有的老项目会导致XCode闪退,这种闪退还很奇怪,运行第一次的时候不闪退,运行第二次的时候XCode闪退必现,这么神奇的现象着实让人摸不着头脑,XCode闪退时候的报错信息如下:Thread0Crashed::Dispatchqueue:com.apple.main-thread0CallstackAnalysis......
  • 《代码大全 》第11-15 章读后感
    第11章:代码布局和风格代码清晰性:理解了如何通过合理的代码布局和命名约定来提高代码的清晰度。一致性:认识到在整个项目中保持一致的代码风格对于维护和理解代码的重要性。代码美学:意识到良好的代码布局和风格可以提升代码的美感,使阅读和修改变得更加愉快。第12章:代码重构重构......
  • LeetCode2058. 找出临界点之间的最小和最大距离
    本题,有一定难度,但不大(我设了个全局变量,被坑了题目:本题要我们求出两个极值点最大距离以及最小距离,如果不存在则返回[-1,-1]不难看出,最小距离只会在相邻两个极值点取得,最大值则是一头一尾,这也启发我们要设置变量,用来记录头尾极值点的位置,以及两个相邻极值点的距离代码如......
  • 代码随想录算法训练营第二十八天| leetcode122.买卖股票的最佳时机 II、leetcode55.
    1leetcode122.买卖股票的最佳时机II题目链接:122.买卖股票的最佳时机II-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili思路:自己不知道怎么写出来的一道题目,就觉得理解上面就是找到了方法,但是后面再......
  • 软件设计:实验15:职责链模式
    实验15:职责链模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式的动机,掌握该模式的结构;2、能够利用职责链模式解决实际问题。 [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万......
  • 15Java集合进阶(异常、集合)
    一、异常1.1认识异常接下来,我们学习一下异常,学习异常有利于我们处理程序中可能出现的问题。我先带着同学们认识一下,什么是异常?我们阅读下面的代码,通过这段代码来认识异常。我们调用一个方法时,经常一部小心就出异常了,然后在控制台打印一些异常信息。其实打印的这些异常信息......
  • LeetCode - #146 LRU 缓存(Top 100)
    文章目录前言1.描述2.示例3.答案关于我们前言本题为LeetCode前100高频题我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。LeetCode算法到目前我们已经更新到145期......
  • 20222415 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容本周学习了Web安全。2.实验过程(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式Registrar:MarkMonitorInc.RegistrarAbuseContactEmail:abusecomplaints@markmonitor.comRegistrarAbuseContactP......
  • leetcode1109. 航班预订统计
    1109.航班预订统计这道题使用暴力解法,如果数据比较多,first和second跨度比较大时会超时。比如下面这个暴力解:classSolution{public:vector<int>corpFlightBookings(vector<vector<int>>&bookings,intn){vector<int>res(n,0);intsize=boo......
  • 15个必备项目管理软件与10款最常用的,最终你选哪款?
    项目管理软件在现代项目管理中扮演着至关重要的角色,它能帮助团队理清项目脉络、实时追踪进度、确保任务按时完成,提升团队工作效率和协作能力。在当今竞争激烈的商业环境中,项目的复杂性和多样性不断增加,项目管理软件成为了不可或缺的工具。它可以将庞大的项目分解为具体的任务和......