首页 > 其他分享 >力扣---15. 三数之和

力扣---15. 三数之和

时间:2022-12-13 00:35:33浏览次数:45  
标签:p2 --- p1 15 nums 重复 三元组 力扣 ++

给你一个整数数组 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]]
解释:
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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

一开始对暴力法做了些剪枝优化,结果还是运行超时。之后使用了双指针,由于刚开始的思路有问题,虽然能做出来,但被数组越界的问题搞得焦头烂额,写了一大堆if,else。在之后学习了下大佬的思路,优化了下写法,终于是做了出来。需要注意到的情况放注释里了。

代码如下:

 1 class Solution {
 2     public List<List<Integer>> threeSum(int[] nums) {
 3         Arrays.sort(nums);
 4         List<List<Integer>> res = new ArrayList<>();
 5         //i < nums.length - 2 是为了避免指针越界。
 6         for (int i = 0; i < nums.length - 2; i ++) {
 7             //如果nums[0] > 0 ,因为已经排好序了,之后的数字也肯定大于0,此时必定不会出现相加等于0的情况。
 8             if (nums[0] > 0) {
 9                 break;
10             }
11             //针对nums[i] 重复出现的情况去重。
12             if (i > 0) {
13                 if (nums[i] == nums[i - 1]) {
14                     continue;
15                 }
16             }
17             //定义指针,保证不会出现 i == p1, i == p2, p1 == p2的情况。
18             //定义左指针
19             int p1 = i + 1;
20             //定义右指针
21             int p2 = nums.length - 1;
22             
23             while (p1 < p2) {
24                 int ans = nums[i] + nums[p1] + nums[p2];
25                 if (ans < 0) {
26                     p1 ++;
27                     //针对nums[p1]重复。
28                     while(p1 < p2 && nums[p1] == nums[p1 - 1]) {
29                         p1 ++;
30                     }
31                 } else if (ans > 0) {
32                     p2 --;
33                     //针对nums[p2]重复。
34                     while (p1 < p2 && nums[p2] == nums[p2 + 1]) {
35                         p2 --;
36                     }
37                 } else {
38                     //之前已经针对nums[i], nums[p1], nums[p2]重复出现的情况去过重了,且由于左右指针的定义,可以确保没有重复值。
39                     res.add(new ArrayList<>(Arrays.asList(nums[i], nums[p1], nums[p2])));
40                     p1 ++;
41                     //针对nums[p1]重复。
42                     while(p1 < p2 && nums[p1] == nums[p1 - 1]) {
43                         p1 ++;
44                     }
45                     p2 --;
46                     //针对nums[p2]重复。
47                     while (p1 < p2 && nums[p2] == nums[p2 + 1]) {
48                         p2 --;
49                     }
50                 }
51             }
52         }
53         return res;
54     }
55 }

运行结果:

运行结果

 

标签:p2,---,p1,15,nums,重复,三元组,力扣,++
From: https://www.cnblogs.com/allWu/p/16977523.html

相关文章

  • Selenium13--模拟键盘操作
    键盘操作概述自动化测试的本质使用程序运行代替对于网页的人工操作。用户在网页上操作时,可能会按下键盘上的各种按键。比如:输入登录账号信息后,直接在文本框里按下键......
  • C++编程题[2022-12-13]
    C++编程题[2022-12-13]题1:采用面向对象的程序设计方法编写一个一卡通管理系统,要求使用多继承、虚函数、虚基类,要有设定类别、计算消费额等功能。题2:定义一个处理时间......
  • Selenium14--模拟鼠标操作
    模拟鼠标操作在实际场景中,会有单击、长时间单击、双击、右击、拖放、移动等鼠标操作,或在当前光标位置的按键输入或鼠标操作。selenium提供了名为ActionChains的类来处理......
  • AWS-自建集群K8s-Master控制面板
    control-planeinit-kubeadm.yaml#catinit-kubeadm.yamlapiVersion:kubeadm.k8s.io/v1beta3bootstrapTokens:-groups:-system:bootstrappers:kubeadm:defaul......
  • Selenium4+Python3系列(十三) - 与docker中的jenkins持续集成
    前言文章更新到这一篇时,其实我还是很开心的,因为这也正是这系列教程的最后一篇文章,也算是完成了一个阶段性的小目标,也很感谢那些愿意看我文章与我交流学习的同学,感谢有你们......
  • AWS-自建集群K8s-Calico部署
    CalicoInstall镜像下载dockerpulldocker.io/calico/cni:v3.24.5dockerpulldocker.io/calico/node:v3.24.5dockerpulldocker.io/calico/kube-controllers:v3.24.......
  • 谷粒商城项目-01-服务框架搭建
    代码上传Gitee先在Gitee上创建账号去官网下载git,安装在任意目录下的空白处,右键 输入以下命令:gitconfig--globaluser.name"你自己在Gitee上注册用户名"git......
  • 奋斗百天我要xueC--01
    0x00打个鸡血,浸泡理论,一年打基础,两年见成效,三年有突破。第一次放弃是浪费时间,第二次放弃会打击信心,第三次会摧毁意志。0x01进制转换整数进制转十进制假设当前数字是N......
  • 图论-堆-并查集-2503. 矩阵查询可获得的最大分数
    2503.矩阵查询可获得的最大分数DescriptionDifficulty:困难RelatedTopics:给你一个大小为mxn的整数矩阵grid和一个大小为k的数组queries。找出一个大小......
  • day3-2022.12.12-flex布局初识
    一、完成以下布局。二、代码如下:<template><div><divclass="title">MYFirstFlexLearn</div><divclass="box"><divclass="item">......