Leetcode Hot 100之五:15. 三数之和

15.三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != 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]]
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]

思路

暴力循环:直接三重循环涵盖所有组合。
但是我们注意到,因为题目要求答案不重复,那么我们就应该想到排序。此外,除开第一层循环,剩下的两层循环就是双指针寻找固定值。

java代码

原有代码

报错说内存超出限制。

class Solution {public List<List<Integer>> threeSum(int[] nums) {int len=nums.length;List<List<Integer>>ans = new ArrayList<List<Integer>>();if(len<3) return ans;Arrays.sort(nums);int target=0;int j=0;int k=len-1;//第一个数从左到右遍历,第二个数从第一个数的右边开始遍历,第三个数从数组最右侧开始遍历。for(int i=0;i<len;i++){//target为第二个数和第三个数的理想目标值。如果此时就已经<0了,又因为数组是从小到大排序的。那么第二个数和第三个数怎么遍历都不可能加起来<0,所以退出循环。target=0-nums[i];if(target<0) break;//因为答案要求不重复,那么第一层循环需要跳过重复的元素。while(i<len&&nums[i]==nums[i+1]) i++;System.out.println(target);j=i+1;k=len-1;while(j<k){//因为答案要求不重复,那么第二层和第三层循环需要跳过重复的元素。while(j<k&&nums[k-1]==nums[k]) k--;while(j<k&&nums[j+1]==nums[j]) j++;//temp为第二个数和第三个数实际的值。int temp=nums[j]+nums[k];if(temp<target) j++;else if(temp>target) k--;else{List<Integer> list = new ArrayList<Integer>();list.add(nums[i]);list.add(nums[j]);list.add(nums[k]);ans.add(list);j++;k--;}}    }return ans;}
}

问题指出与改进

提交后显示内存超出限制,实际上依旧是逻辑有问题。

首先

while(i<len&&nums[i]==nums[i+1]) i++;
\\不应该这么写,而应该这么写
if(i>0&&nums[i]==nums[i-1]) continue;```

以下的话能看懂就看,看不懂就看样例解释
这两种都会跳过计算重复的i值。但是第一种是先跳过,再去计算j和k对应的情况。那么就会导致漏掉j也为重复的i值对应的答案。而第二种是先计算j和k对应的情况,下一个i来的时候再看是否与上次的i重复,以此判断跳不跳过。

样例解释
nums = [-1,0,1,2,-1,-4],排序后为[-4,-1,-1,0,1,2]
第一种碰到第一个-1时就会判断下一位是否也是-1,因为下一位确实是-1,所以它的i直接从第二个-1开始,那么就导致j只能从第二个-1后面的0开始。
而实际上答案包括i为第一个-1,j为第二个-1,k为2的情况。也就是j与i的值是重复的。所以不能提前跳。

其次

while(j<k&&nums[k-1]==nums[k]) k--;
while(j<k&&nums[j+1]==nums[j]) j++;

以下的话能看懂就看,看不懂就看样例解释
判断第二重循环和第三重循环时,因为不像是i的移动会限制j一样,他们跳过重复的值与不跳,都是在i和数组结尾之间的范围移动(其实就是第二重循环和第三重循环是并行的另一种体现),所以这里可以用while循环。
但是这个while循环不应该在答案加入j和k之前就判断,而是应该在加入答案后再判断。因为会漏掉j和k相等的答案情况。

样例解释
nums=[-4,-2,1,-5,-4,-4,4,-2,0,4,0,-2,3,1,-5,0],
排序后就是 -5 -5 -4 -4 -4 -2 -2 -2 0 0 0 1 1 3 4 4
结果应该输出[[-5,1,4],[-4,0,4],[-4,1,3],[-2,-2,4],[-2,1,1],[0,0,0]]
但是如果while循环在答案加入j和k之前就判断,那么当k移动到第二个1的时候,它就会自动跳到第一个1,那么答案的[-2,1,1]就会丢失。j的移动同理。

改进后的代码

class Solution {public List<List<Integer>> threeSum(int[] nums) {int len=nums.length;List<List<Integer>>ans = new ArrayList<List<Integer>>();if(len<3) return ans;Arrays.sort(nums);int target=0;int j=0;int k=len-1;//第一个数从左到右遍历,第二个数从第一个数的右边开始遍历,第三个数从数组最右侧开始遍历。for(int i=0;i<len-1;i++){//target为第二个数和第三个数的理想目标值。如果此时就已经<0了,又因为数组是从小到大排序的。那么第二个数和第三个数怎么遍历都不可能加起来<0,所以退出循环。target=0-nums[i];if(target<0) break;//因为答案要求不重复,那么第一层循环需要跳过重复的元素。// 注意出现了nums[i-1],那么要加上i>0的判断if(i>0&&nums[i]==nums[i-1]) continue;j=i+1;k=len-1;while(j<k){//temp为第二个数和第三个数实际的值。int temp=nums[j]+nums[k];if(temp<target) j++;else if(temp>target) k--;else{//因为答案要求不重复,那么第二层和第三层循环需要跳过重复的元素。ans.add(Arrays.asList(nums[i], nums[j],nums[k]));while(j<k&&nums[k-1]==nums[k]) k--;while(j<k&&nums[j+1]==nums[j]) j++;k--;j++;}}    }return ans;}
}

其他知识点:ans.add(Arrays.asList(nums[i], nums[j],nums[k]));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlGaN/GaN HFET 五参数模型

标题&#xff1a;A Five-Parameter Model of the AlGaN/GaN HFET 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;15年&#xff09; 摘要—我们引入了AlGaN/GaN异质结场效应晶体管&#xff08;HFET&#xff09;漏极电流Id&#xff08;Vgs&#xff0c;Vds…

Android---屏幕适配的处理技巧

在几年前&#xff0c;屏幕适配一直是困扰 Android 开发工程师的一大问题。但是随着近几年各种屏幕适配方案的诞生&#xff0c;以及谷歌各种适配控件的推出&#xff0c;屏幕适配也显得越来越容易。下面&#xff0c;我们就来总结一下关于屏幕适配的那些技巧。 ConstraintLayout …

万物社用户运营工具:无代码开发下的电商平台和CRM集成

简介&#xff1a;万物社与集简云的引领式连接 万物社&#xff0c;隶属于厦门头号云信息科技有限公司&#xff0c;是一家专注于互联网和相关服务的企业。在日常的业务运营中&#xff0c;万物社通过与集简云的无代码集成&#xff0c;实现了业务流程的自动化和智能化&#xff0c;…

VINS-Mono-后端优化 (二:预积分残差雅可比推导)

文章目录 对位置 δ α \delta\alpha δα 进行求导位置误差 δ α \delta\alpha δα 对平移 P b k w P^{w}_{b_{k}} Pbk​w​ 的求导位置 δ α \delta\alpha δα 对旋转 R w b k R^{b_{k}}_{w} Rwbk​​ 进行求导 对速度 δ β \delta\beta δβ 进行求导速度 δ β…

使用零拷贝技术实现消息转发功能

零拷贝技术介绍&#xff1a;史上最全零拷贝总结-CSDN博客 这是一个简单的基于epoll的Linux TCP代理程序&#xff0c;通过匿名管道和零拷贝技术的splice函数&#xff0c;将两个TCP端口相互连接&#xff0c;并转发数据。 #define _GNU_SOURCE 1 #include <sys/socket.h> …

前端安全方面有哪些攻击方式?

在前端开发中&#xff0c;存在一些常见的安全攻击方式。以下是一些常见的前端安全攻击方式&#xff1a; 1&#xff1a;跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; XSS攻击是指攻击者通过在网页中注入恶意脚本&#xff0c;使得用户在浏览器中执行该脚本&#xff0c;…

C语言 每日一题 PTA 11.7 day13

1.求e的近似值 自然常数 e 可以用级数 1 1 / 1! 1 / 2! ⋯ 1 / n! ⋯ 来近似计算。 本题要求对给定的非负整数 n&#xff0c;求该级数的前 n 1 项和。 代码实现 #include<stdio.h> void main() {int a, i, j; double b 1; double c 1;printf("请输入一个数\n…

Linux RPM包安装、卸载和升级

我们以安装 apache 程序为例。因为后续章节还会介绍使用源码包的方式安装 apache 程序&#xff0c;读者可以直观地感受到源码包和 RPM 包的区别。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到表 1 所…

如何使用 GTX750 或 1050 显卡安装 CUDA11+

前言 由于兼容性问题&#xff0c;使得我们若想用较新版本的 PyTorch&#xff0c;通过 GPU 方式训练模型&#xff0c;也得更换较新版本得 CUDA 工具包。然而 CUDA 的版本又与电脑显卡的驱动程序版本关联&#xff0c;如果是低版本的显卡驱动程序安装 CUDA11 及以上肯定会失败。 比…

Java TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; impor…

计算机毕设 基于机器学习的文本聚类 - 可用于舆情分析

文章目录 0 简介1 项目介绍1.1 提取文本特征1.2 聚类算法选择 2 代码实现2.1 中文文本预处理2.2 特征提取2.2.1 Tf-idf2.2.2 word2vec 2.3 聚类算法2.3.1 k-means 2.3.2 DBSCAN2.4 实现效果2.4.1 tf-idf k-means聚类结果2.4.2 word2vec k-means 聚类结果 最后 0 简介 今天学…

抢量双11!抖音商城「官方立减」 缘何成为“爆单神器”?

10月20日抖音商城双11好物节正式开跑&#xff0c;仅仅三天&#xff0c;抖音商城整体GMV对比去年同期提升了200%&#xff0c;而在开跑一周后&#xff0c;一些品牌的销售额已经超过了今年整个618&#xff0c;可谓增势迅猛。其中&#xff0c;平台官方特别推出的「官方立减」玩法&a…

acwing算法基础之搜索与图论--kruskal算法

目录 1 基础知识2 模板3 工程化 1 基础知识 kruskal算法的关键步骤为&#xff1a; 将所有边按照权重从小到大排序。定义集合S&#xff0c;表示生成树。枚举每条边(a,b,c)&#xff0c;起点a&#xff0c;终点b&#xff0c;边长c。如果结点a和结点b不连通&#xff08;用并查集来…

K8S篇之Pod一直处于Pending状态原因解析

常见现象&#xff1a;Pod一直处于Pending状态。 废话不多说&#xff0c;直接上料。 可能原因1&#xff1a;Pod未被调度到节点上。 当 Pod 一直处于 Pending 状态时&#xff0c;说明该 Pod 还未被调度到某个节点上&#xff0c;需查看 Pod 分析问题原因。 例如执行&#xff1a…

计算机网络技术

深入浅出计算机网络 微课视频_哔哩哔哩_bilibili 第一章概述 1.1 信息时代的计算机网络 1. 计算机网络各类应用 2. 计算机网络带来的负面问题 3. 我国互联网发展情况 1.2 因特网概述 1. 网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系 如图所示&#xff0…

【机器学习2】模型评估

模型评估主要分为离线评估和在线评估两个阶段。 针对分类、 排序、 回归、序列预测等不同类型的机器学习问题&#xff0c; 评估指标的选择也有所不同。 1 评估指标 1.1准确率 准确率是指分类正确的样本占总样本个数的比例 但是准确率存在明显的问题&#xff0c;比如当负样本…

【React】05.JSX语法使用上的细节

JSX构建视图的基础知识 JSX&#xff1a;javascript and xml&#xff08;html&#xff09;把JS和HTML标签混合在了一起[并不是我们之前玩的字符串标签] 1、vscode如何支持JSX语法[格式化、快捷提示…] 创建的js文件&#xff0c;把后缀名设置为jsx即可&#xff0c;这样js文件中就…

单词规律问题

给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…

可以体现Python语法精妙的十个例子!

文章目录 前言1.for - else2.一颗星*和两颗星**3.三元表达式4.with - as5.列表推导式6.列表索引的各种骚操作7.lambda函数8.yield 以及生成器和迭代器9.装饰器10.巧用断言assertPython技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学习视频5、实战案例…

“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配 1.1 从目标字符串的角度来看&#xff0c;LC139是一个排列问题&#xff0c;因为最终目标子串的各个字符的顺序是固定的&#xff1f; 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题&#xff0c;确实可以认为它涉及到排列的概念&#xff0c;但这种…