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

力扣—15.三数之和

时间:2024-11-23 21:30:08浏览次数:13  
标签:right 15 nums 三数 元素 三元组 力扣 指针 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

整体思路:

        本题最重要的就是避免超时也就是去重,疯狂去重!!

        题干表明顺序并不重要那我们只要找到和为0的三个数就行,对数组元素排序,排好序对于找符合题干的元素就很容易了,就面对了第二大问题:去重

        比如第一个例子排好序为-4,-1,-1,0,1,2

        当我们遍历这个数组的时候-1和-1是相同的也就是对应的答案是相同的那么只考虑一个就可以

        找符合相加=0利用双指针遍历,指针1在当前i的下一个,指针2在最后一个元素

        如果找到了相加等于0输出这组元素并且去重!!之后再让两个指针同时向中间移动再看有没有符合条件的直到1、2指针重合证明全遍历完了结束当前i,到下一个i+1

        如果没找到相加等于0的和0对比,大于0的证明数太大,2指针向左移动(排序后左小右大)

                                                              小于0的证明数太小,1指针向右移动

代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());  // 先对数组进行排序
        for (int i = 0; i < nums.size() - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;  // 跳过重复的元素
            int left = i + 1, right = nums.size() - 1;//双指针:一个在
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];                
                if (sum == 0) {
                    ans.push_back({nums[i], nums[left], nums[right]});
                    
                    // 跳过重复的元素
                    while (left < right && nums[left] == nums[left + 1]) left++;
                    //当前元素和下一个元素相同直接考虑下一个元素,因为俩数相同结果不变
                    while (left < right && nums[right] == nums[right - 1]) right--;
                    
                    left++;
                    right--;
                } 
                else if (sum < 0) {
                    left++;
                } 
                else {
                    right--;
                }
            }
        }
        return ans;
    }
};

标签:right,15,nums,三数,元素,三元组,力扣,指针,left
From: https://blog.csdn.net/lllay_/article/details/143998061

相关文章

  • 【K8S问题系列 | 15】资源配额不足导致Pod无法调度的场景如何处理
    在Kubernetes中,资源配额不足可能导致Pod无法调度,这种情况通常发生在命名空间的资源使用达到了设定的上限。以下是一些处理这类情况的策略和方法:1.监控资源使用情况实施监控使用监控工具(如Prometheus和Grafana)实时监控命名空间和集群的资源使用情况。设置告警规......
  • 15.C++STL 2(string类的使用,6000字详解)
    ⭐本篇重点:string类的使用⭐本篇代码:c++学习/05.string类的学习·橘子真甜/c++-learning-of-yzc-码云-开源中国(gitee.com)一.C/C++字符与string类    我们知道,C语言提供的字符串都是以'\0'为结尾的,在C语言中,库函数给我们提供了很多字符串函数,比如strlen(......
  • 掌握15个PHP8新特性 助你快速上手php
    1、命名参数:一种允许开发者通过参数名称而非位置顺序将参数传递给函数的特性。这种特性提供了更高的灵活性和可读性,使得函数调用更加清晰、直观。function greet($name, $age) {         echo "Hello $name, you are $age years old."; }  greet(age:......
  • 【问题描述】 教练给小智设定了一个每天锻炼的积分奖励计划。一天内,每锻炼15分钟,就能
    【问题描述】教练给小智设定了一个每天锻炼的积分奖励计划。一天内,每锻炼15分钟,就能获得1个体能积分。不足15分钟的锻炼时间被舍弃,不能获得积分。如果积分达到了7,这周就可以用积分来换一个奖品。编写一个程序来计算小智最快几天就能获得奖品。输入有一行,包含7个用空格隔开......
  • 基于MPC、PID、 ode15s的无人机开发模型预测控制研究(Matlab代码实现)
            ......
  • 802.15.4 WPAN协议-扫描、同步、入网和退网等消息流程
    802.15.4WPAN协议-扫描、同步、入网和退网等消息流程文章目录一、原语二、消息流程1.接收超帧和发送超帧的时序2.能量检测(ED)信道扫描3.主动扫描和被动扫描3.1主动扫描3.2被动扫描4.启动PAN网络5.重组PAN网络6.入网过程7.退网过程8.同步过程一、原......
  • 推荐15个 Vue 常用自定义指令,含实现原理与使用方式
    前言Vue.js是一个流行的前端框架,它的核心理念是通过指令(Directives)来扩展HTML的能力。尽管Vue.js已经内置了一些非常实用的指令(比如v-if,v-show,v-for等),但有时候我们还是需要创建自定义指令来满足特定的需求。今天我们就来聊聊Vue常用的自定义指令,它们能让你的......
  • 150份Java计算机毕业设计项目推荐(源码+论文+PPT)
    2024最新Java项目选题推荐哈喽,大家好,大四的同学马上要开始做毕业设计了,大家做好准备了吗?博主给大家详细整理了150个Java项目选题推荐,有什么疑问可在评论区留言哦!需要链接请私信我哦!或者在评论区打出来!02:基于Java+springboot的报名系统03:基于Java+springboot的培训管理系统......
  • SQL实战训练之,力扣:1709. 访问日期之间最大的空档期
    目录        一、力扣原题链接        二、题目描述        三、建表语句        四、题目分析                五、SQL解答        六、最终答案        七、验证        八、知识点一、......
  • 基于KU115+ZU19EG+C6678 的高性能6U VPX 载板
    基于KU115+ZU19EG+C6678的高性能6UVPX载板,板载2个HPC形式的FMC连接器(用于外部信号扩展)。板卡选用了1片Xilinx公司的KintexUltraScale系列FPGA家族中的XCKU115-2FLVA1517I和1片ZynqUltraScale+MPSoC家族的XCZU19EG-2FFVC1760I以及1片TI公司的DSP芯片T......