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

2023-12-04 01:44

本文主要是介绍【数组】-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;}
}

写在后面

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

这篇关于【数组】-Lc15-三数之和(排序+for循环+滑动窗口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451648

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(