首页 > 其他分享 >【LeetCode刷题记录】15. 三数之和

【LeetCode刷题记录】15. 三数之和

时间:2024-04-08 11:32:00浏览次数:30  
标签:15 nums int 三数 len 三元组 continue && LeetCode

15 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [ n u m s [ i ] , n u m s [ j ] , n u m s [ k ] ] [nums[i], nums[j], nums[k]] [nums[i],nums[j],nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] = = 0 nums[i] + nums[j] + nums[k] == 0 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
− 1 0 5 -10^5 −105 <= nums[i] <= 1 0 5 10^5 105

思路

本题使用双指针思想。首先需要将数组进行排序,然后将 k 指针固定,i 指针指向 k 的下一个元素,j 指向末元素。
在从头至尾遍历k的情况下,对 i,j 指针分情况讨论,这样可使时间复杂度降到 O ( N 2 ) O(N^2) O(N2).固定k,
当 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] < 0 nums[i]+nums[j]+nums[k]<0 nums[i]+nums[j]+nums[k]<0时, i + + i++ i++;
当 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] > 0 nums[i]+nums[j]+nums[k]>0 nums[i]+nums[j]+nums[k]>0时, j − − j-- j−−;
当 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] = = 0 nums[i]+nums[j]+nums[k]==0 nums[i]+nums[j]+nums[k]==0时,存储三个元素到数组中。
当 i = = j i==j i==j时就跳出循环。
注意直接这样写会超出时间限制,需要考虑重复元素的情况:
只有元素不同才进行枚举。

if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
if (i > k + 1 && nums[i] == nums[i - 1]) {
                    continue;
                }

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int len = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector<int>> sum;
        for (int k = 0; k < len; k++) {
            if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            int j = len - 1;
            int tmp = -nums[k];
            for (int i = k + 1; i < len; i++) {
                if (i > k + 1 && nums[i] == nums[i - 1]) {
                    continue;
                }
                while (i < j && nums[i] + nums[j] > tmp) {
                    j--;
                }
                if (i == j) {
                    break;
                }
                if (nums[i] + nums[j] == tmp) {
                    sum.push_back({nums[i], nums[j], nums[k]});
                }
            }
        }
        return sum;
    }
};

标签:15,nums,int,三数,len,三元组,continue,&&,LeetCode
From: https://blog.csdn.net/C_greenbird/article/details/137501042

相关文章

  • Leetcode 2894. 分类求和并作差
    https://leetcode.cn/problems/divisible-and-non-divisible-sums-difference/submissions/521201434/给你两个正整数n和m。现定义两个整数num1和num2,如下所示:num1:范围[1,n]内所有无法被m整除的整数之和。num2:范围[1,n]内所有能够被m整除的整数之和。......
  • WebSocket manager.js:115 GET http://IP:8000/socket.io/?EIO=4&transport=polling&t
    前言全局说明WebSocket报错net::ERR_CONNECTION_TIMED_OUT一、问题:WebSocket报错net::ERR_CONNECTION_TIMED_OUT二、原因:可能和后端的服务链接不上导致的三、解决方法:重启启动后端服务免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后......
  • 力扣经典150题第九题:跳跃游戏
    目录1.简介2.问题描述3.解题思路方法一:贪心算法4.算法实现方法一:贪心算法5.示例与测试6.总结与展望7.结语1.简介本篇博客将讨论力扣经典150题中的跳跃游戏问题。给定一个非负整数数组nums,数组中的每个元素代表在该位置可以跳跃的最大长度,判断是否能够从......
  • 【mac权限】解决 mac 运行报错 150: Operation not permitted
    Couldnotsetenvironment:150:OperationnotpermittedwhileSystemIntegrityProtectionisengagedMac下操作文件,遇到Operationnotpermitted原来是索引服务被关闭,导致对文件夹的操作权限失效解决步骤打开系统偏好设置,隐私与安全性,左侧选择‘文件和文件夹’,......
  • LeetCode刷题记录——day10
    1、https://leetcode.cn/problems/rotate-image/description/?envType=study-plan-v2&envId=2024-spring-sprint-100classSolution{public:voidrotate(vector<vector<int>>&matrix){intn=matrix.size();for(inti=0;......
  • LeetCode题练习与总结:插入区间--57
    一、题目描述示例 1:输入:intervals=[[1,3],[6,9]],newInterval=[2,5]输出:[[1,5],[6,9]]示例2:输入:intervals=[[1,2],[3,5],[6,7],[8,10],[12,16]],newInterval=[4,8]输出:[[1,2],[3,10],[12,16]]解释:这是因为新的区间[4,8]与[3,5],[6,7],[8,10] 重叠。......
  • LeetCode题练习与总结:最后一个单词的长度--58
    一、题目描述给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1:输入:s="HelloWorld"输出:5解释:最后一个单词是“World”,长度为5。示例2:输入:s="......
  • Leetcode 866. 回文质数
    https://leetcode.cn/problems/prime-palindrome/description/给你一个整数n,返回大于或等于n的最小回文质数。一个整数如果恰好有两个除数:1和它本身,那么它是质数。注意,1不是质数。例如,2、3、5、7、11和13都是质数。一个整数如果从左向右读和从右向左读是相同的,那......
  • 从数组创建二叉树-Leetcode测试用
    Leetcode里和二叉树相关的题目,都是用一个数组表示二叉树的,而这个数组是按照层次优先顺序给出的,连其中的空结点也表示了出来,刚好就是2^N-1个结点,N表示层数。但数组毕竟无法和二叉树一样具有链式结构,无法进行算法测试,因此尝试直接通过这样的数组构建二叉树。通过数组创建这样的二......
  • P2680 [NOIP2015 提高组] 运输计划
    P2680[NOIP2015提高组]运输计划二分+树剖开始题目理解错了,这里的最短时间指的是所有路径的最大值。所以题目要求的就是让所有路径的最大值最小,显然可以二分。二分最大值\(x\),那么假如一条路径长度为\(d\)并且\(d>x\),显然需要修改,即一定要删去路径上的一条边\((u,v)\),满......