当前位置: 首页 > news >正文

【数组】-Lc15-三数之和(排序+for循环+滑动窗口)

写在前面

  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。


目录

  • 写在前面
  • 一、场景描述
  • 二、具体步骤
    • 1.环境说明
    • 2.代码
  • 写在后面


一、场景描述

  给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c 使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]

二、具体步骤

1.环境说明

名称说明
IntelliJ IDEA2019.2

2.代码

以下为Java版本实现:

public class Lc15_threeSum {public static void main(String[] args) {
//        int[] nums = {-4, 4, -1, 0, 1, 2, -1, -4};int[] nums = {-1, 0, 1, 2, -1, -4};System.out.println(threeSum(nums));}/*** 思路:* 三数之和,程序化思维:确定第一个数,再找另外2个数* 排序(只有排序,后面的滑动窗口才有意义) + for循环(第1个位置)、while后2个位置(滑动窗口)** 返回值是List<List>* 三数之和可以变成找三个索引位置** 由小到大进行Arrays.sort排序,{-4, -4, -1, -1, 0, 1, 1, 2}* 要考虑数字重复跳过问题** 因为要找3个数相加等于0,也就是要找到3个位置* for循环nums,可以得到3个位置 i, l=i+1, r=nums.length-1* i确定第1个数,l和r确定后2个数(while循环,滑动窗口, 从两边到中间移动)** for循环条件:i=0, i < nums.length - 2 && nums[i] <= 0(*      因为要留出另外2个数的索引,所以 i < nums.length -2*      如果nums[i] 大于0, 往后面的数据就不需要找了,题目是三数之和等于0* )** while循环(l < r)* 用sum = nums[i] + nums[l] + nums[r]和0的值进行比较* 如果小于0,l++* 如果大于0,r--* 如果等于0,i,l,r 添加到list。 l++, r--继续找(此处要对l和r判断去重)** l>r则没找到sum=0的值,i++继续下一轮循环(此处要对i进行去重判断)**/private static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();// 排序Arrays.sort(nums);// !注意: num[i] > 0就不需要找了,因为是求三数之和等于0for (int i = 0; i < nums.length - 2 && nums[i] <= 0;) {int l = i + 1, r = nums.length - 1;// !!!找的是2个位置,所以没有等于号while (l < r) {int sum = nums[i] + nums[l] + nums[r];if (sum == 0) {result.add(Arrays.asList(nums[i], nums[l++], nums[r--]));// lr指针要去重while (l < r && nums[l] == nums[l - 1]) {l++;}while (l < r && nums[r] == nums[r + 1]) {r--;}} else if (sum < 0) {l++;} else {r--;}}i++;// i每移动一次,i的值也需要去重while (i < nums.length - 2 && nums[i] == nums[i - 1]) {i++;}}return result;}
}

写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

相关文章:

  • 详细学习Pyqt5的10种容器(Containers)
  • 【自动化测试】pytest 用例执行中print日志实时输出
  • WEBAPI返回图片显示在VUE前端
  • 设置随机种子保证网络可复现性
  • JAVA代码优化:Spring中redis的工具类
  • Java Web——动态Web开发核心-Servlet
  • 短线买入卖出有哪些交易技巧?
  • 使用 Mybatis 的 TypeHandler 存取 Postgresql jsonb 类型
  • 固态硬盘与机械硬盘的区别
  • Java的多态性
  • 栈和队列的OJ题——14.用栈实现队列
  • 区块链媒体:Web3.015个方法解析-华媒舍
  • 华为OD机试真题-找城市-2023年OD统一考试(C卷)
  • KDE环境文件夹user-dirs为英文
  • android 13.0 framework禁用系统所有通知
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular 响应式表单 基础例子
  • canvas 五子棋游戏
  • Cookie 在前端中的实践
  • Java 内存分配及垃圾回收机制初探
  • Javascript 原型链
  • Js基础知识(一) - 变量
  • Node + FFmpeg 实现Canvas动画导出视频
  • nodejs:开发并发布一个nodejs包
  • passportjs 源码分析
  • react 代码优化(一) ——事件处理
  • React-生命周期杂记
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • scrapy学习之路4(itemloder的使用)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 实现简单的正则表达式引擎
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 国内开源镜像站点
  • # centos7下FFmpeg环境部署记录
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Python第六天)文件处理
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (一)Dubbo快速入门、介绍、使用
  • (一)Linux+Windows下安装ffmpeg
  • (转) ns2/nam与nam实现相关的文件
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)大型网站架构演变和知识体系
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .apk 成为历史!
  • .bat文件调用java类的main方法
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 命令行参数包含应用程序路径吗?
  • .net 无限分类
  • .NET/C# 使窗口永不获得焦点