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

今日 leetCode 15.三数之和

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

题解:

法一:排序 + 双指针

1. 先将目标数组排序,使其由小到大排序

Arrays.sort(nums);

2. 基本逻辑:设置三个指针,第一个指针i从头开始遍历,第二个指针left在i后一个位置开始遍历,第三个指针right则从最后一个位置开始遍历。

for(int i = 0;i < nums.length;i++) {int left = i + 1;int right = nums.length - 1;while(right > left) {int sum = nums[i] + nums[left] + nums[right];if(sum > 0) {right--;}else if(sum < 0) {left++;}else {res.add(Arrays.asList(nums[i],nums[left],nums[right]));right--;left++;}}}

3. 特殊情况直接返回

若nums[0]指向0则证明所有元素都大于0,不可能会有三个数之和大于0,返回空列表。

if(nums[0] > 0) {return res;}

4. 去重操作

4.1 对i指针去重

i指针指向的新元素与其之前指向的元素为同一个元素,直接跳过

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

4.2 对left、right指针去重(添加新结果是进行去重)

while(right > left && nums[right] == nums[right - 1]){right--;}
while(right > left && nums[left] == nums[left + 1]) {left++;}

整体代码实现

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);for(int i = 0;i < nums.length;i++) {if(nums[0] > 0) {return res;}if(i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while(right > left) {int sum = nums[i] + nums[left] + nums[right];if(sum > 0) {right--;}else if(sum < 0) {left++;}else {res.add(Arrays.asList(nums[i],nums[left],nums[right]));while(right > left && nums[right] == nums[right - 1]){right--;}while(right > left && nums[left] == nums[left + 1]) {left++;}right--;left++;}}}return res;}
}

 

http://www.lryc.cn/news/444528.html

相关文章:

  • Games101笔记-二维Transform变换(二)
  • 【洛谷】AT_abc371_c [ABC371C] Make Isomorphic 的题解
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记
  • 【Java】JVM基本组成
  • 解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
  • 淘宝商品详情接口item_get响应参数解析:props、props_list、prop_img
  • Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)
  • Pandas_iloc_loc_哪个是inclusive哪个是exclusive
  • python是什么语言写的
  • python编程,把所有子目录和文件输出到文本文件
  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘
  • Java中的事件(动作监听-ActionListener)
  • STM32篇:开发环境安装
  • AIGC实战——多模态模型Flamingo
  • 如何在WordPress中添加事件Schema(分步指南)
  • 守护企业资产安全:企业微信群禁止互加好友操作指南!
  • 【QT基础】创建项目项目代码解释
  • 【数据结构】对象的比较
  • 代码随想录八股训练营第四十天| C++
  • 【C++】10道经典面试题带你玩转二叉树
  • 【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景
  • 数组高阶应用(C++版)
  • Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试
  • 解析与实现二叉树
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
  • 操作系统笔记三
  • uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点
  • 基于微信小程序的商品展示+ssm(lw+演示+源码+运行)
  • 【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)