剑指 Offer II 007. 数组中和为 0 的三个数

news2024/11/19 0:22:48

题目链接

剑指 Offer II 007. 数组中和为 0 的三个数 mid

题目描述

给你一个整数数组 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 < = n u m s . l e n g t h < = 3000 3 <= nums.length <= 3000 3<=nums.length<=3000
  • − 1 0 5 < = n u m s [ i ] < = 1 0 5 -10^5 <= nums[i] <= 10^5 105<=nums[i]<=105

分析:

我们先对原数组 nums排序,排序之后我们先固定其中的一个数 nums[i],再在这个数的右边选择两个数 nums[L]nums[R](初始时, L = i + 1 , R = n − 1 L = i + 1,R = n - 1 L=i+1,R=n1),接下来我们就能 双指针 的找 nums[i] + nums[L] + nums[R] == 0的三个数。

在这里插入图片描述

接下来讨论,什么时候答案会重复?

第一种情况:

在这里插入图片描述
因为数组 nums是排好序的,所以相同的元素都在一起。在一堆相同的元素中,我们只需要取一个。 否则就会有重复的记录。

for(int i = 0;i < n;i++){
   //这句的作用是,如果遇到相同的元素,只会取其中的第一个,后面的相同元素直接跳过
   if(i > 0 && nums[i] == nums[i-1]) continue;
}

第二种情况:

在这里插入图片描述
所以我们应该在记录一组答案 {nums[i],nums[L],nums[R]}后,剩下的区间应该从两边去除与 nums[L] 和 nums[R]相同的部分。

....
//假设此时已经记录完答案

//接下来要去除剩下区间两边与 nums[L] 和 nums[R] 相等的部分

	while(l<r && nums[l] == nums[l+1]) l++;
	while(l<r && nums[r] == nums[r-1]) r--;
	//去除完相同部分之后,再缩减区间
	l++;
	r--;

时间复杂度: O ( n 2 ) O(n^2) O(n2)

C++代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;

        int n = nums.size();
        sort(nums.begin(),nums.end());

        for(int i = 0;i < n - 2;i++){
            if(i > 0 && nums[i] == nums[i-1]) continue;

            int l = i + 1, r = n - 1;

            while(l<r){
                int sum = nums[i] + nums[l] + nums[r];
                if(sum > 0) r--;
                else if(sum < 0) l++;
                else{
                    ans.push_back({nums[i],nums[l],nums[r]});
                    
                    while(l + 1 < r && nums[l] == nums[l+1]) l++;
                    while(l < r - 1 && nums[r] == nums[r-1]) r--;
                    l++;
                    r--;
                }
            }
        }
        return ans;
    }
};

Java代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);

        List<List<Integer>> res = new ArrayList<>();

        for(int i = 0;i < n - 2;i++){
            if(i > 0 && nums[i] == nums[i-1]) continue;
            int l = i + 1,r = n - 1;

            while(l<r){
                int sum = nums[i] + nums[l] + nums[r];
                if(sum > 0) r--;
                else if(sum < 0) l++;
                else{
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[l]);
                    list.add(nums[r]);
                    res.add(list);

                    while(l<r && nums[l] == nums[l+1]) l++;
                    while(l<r && nums[r] == nums[r-1]) r--;
                    l++;
                    r--;
                }
            }
        }
        return res;
    }
}

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

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

相关文章

软件测试岗位会消失么

只要互联网还在发展&#xff0c;软件测试岗位就一直被需要&#xff01; 软件测试已经不再只是点点点了&#xff0c;如果只停留在点点点&#xff0c;那么有可能会消失&#xff0c;但是现在测试已经向自动化测试方向发展了 人生如逆水行舟&#xff0c;不进则退。于其浪费时间的…

Golang GC垃圾回收机制理解记录

一、概念对不再使用的是内存资源进行自动回收的功能就叫垃圾回收&#xff08;GC: Garbage Collection&#xff09;二、为什么要有垃圾回收&#xff1f;编程语言需要对内存手动释放&#xff0c;操作繁琐&#xff0c;处理不好会出现内存泄漏&#xff0c;垃圾回收出现使的开发者能…

入门力扣自学笔记234 C++ (题目编号:2325)

2325. 解密消息 题目&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c…

ESP32设备驱动-PCF8591数据采集驱动

PCF8591数据采集驱动 1、PCF8591介绍 PCF8591 是一款单片集成、独立电源、低功耗、8 位 CMOS 数据采集设备。 PCF8591 具有四个模拟输入、一个模拟输出和一个串行 I2C 总线接口。 PCF8591 的三个地址引脚 A0、A1 和 A2 可用于硬件地址编程 8 PCF8591 器件允许访问相同的 I2C…

dig命令命令常见用法

dig命令命令常见用法域名结构dig命令命令常见用法安装dig查看本机使用的dns地址使用dot或doh查询域名解析查询A记录查询dns所有记录值any从ip地址反查询域名dig -x检查txt记录是否生效查看DNS是否开启AXFR协议全量区传输功能dig诊断DNS污染只显示域名的解析ip递归解析dig trace…

全球13台 DNS 根服务器,居然没有一台属于中国!

域名系统是最重要的互联网服务之一&#xff0c;没有它&#xff0c;我们将无法访问在线内容&#xff0c;甚至无法发送电子邮件。每当我们尝试连接到其他网站或在线服务时&#xff0c;根 DNS 服务器都会帮助我们的计算机找到并到达我们想要的地址。 DNS 根服务器是所有 DNS 的组…

MySQL-JDBC反序列化分析

0x01 前言 听师傅们说这条链子用的比较广泛&#xff0c;所以最近学一学&#xff0c;本来是想配合着 tabby 或是 codeql 一起看的&#xff0c;但是 tabby 的环境搭建一直有问题&#xff0c;耽误了很久时间&#xff0c;所以就直接看了 0x02 JDBC 的基础 本来不太想写这点基础的…

LaTeX使用enumitem包切换enumerate标签样式

一、直接使用enumerate 源码&#xff1a; \documentclass{article} \begin{document} \section{LaTeX Style Sample} There is nothing to show, thank you for reading. \begin{enumerate}\item Apple is a kind of fruit.\item Cat is a kind of animal.\item Butterfly is …

git commit之后,回退撤销commit

在commit之后&#xff0c;发现有不需要提交的文件被提交上去了&#xff0c;好在还没有push到远端&#xff0c;需要撤回重新提交。如果是用的是Sourcetree的话,打开Sourcetree操作如下&#xff1a;找到提交之前的版本的记录右键这条提交记录&#xff0c;点击 将xxx重置到这次提交…

Ventoy安装deepin系统(windows和deepin双系统)

目录电脑安装虚拟机安装双系统安装&#xff08;windows和deepin&#xff09;美化deepin系统引导页其他链接电脑安装 我们先制作好Ventoy启动盘&#xff0c;然后插入电脑使用U盘启动 deepin系统镜像下载地址 windows系统镜像下载地址 windows激活软件 ,密码:ev5k windows镜像下载…

Maven实战-1.maven命令

前言 持续更新中… Maven命令 1.mvn help:system 打印出java所有的系统属性和环境变量。 2.mvn clean compile clean告诉Maven清理输出目录target/&#xff0c;compile告诉Maven编译项目的主代码&#xff08;src/main/java目录下&#xff09;。 不要问为什么只是编译了项…

Hive的Rank排名(rank函数,dense_rank函数,row_numer函数)

一、区别&#xff1a;三者通常都会配合窗口函数over()&#xff0c;并结合partition by order by xxx来分组排序&#xff0c;即形式使用&#xff1a;function_name over(partition by xxx order by xxx)。首先三者都是产生一个自增序列&#xff0c;不同的是row_number() 排序的字…

2023年SAT、ACT、AP、Alevel、IB考试时间表

2023年已经来临&#xff01;以下是2023年SAT、ACT、AP、A-Level、IB考试时间安排&#xff0c;早规划早备考&#xff0c;建议大家收藏&#xff01;2023 SAT从2023年开始&#xff0c;美国以外的所有SAT考试都将转为机考&#xff0c;美国SAT考试将在2024年全面转为机考。2023年一共…

前端Vue中实现超炫酷动态背景(全屏背景+自定义banner+登录/注册页)

一、文章引导 #mermaid-svg-9sKRaMRBkdCcbAh2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9sKRaMRBkdCcbAh2 .error-icon{fill:#552222;}#mermaid-svg-9sKRaMRBkdCcbAh2 .error-text{fill:#552222;stroke:#55222…

29相似矩阵和若尔当型

一、知识概要 本节从正定矩阵的回顾谈起&#xff0c;介绍了相似矩阵和若尔当型。但是没有进行深入介绍&#xff0c;主要目的是让我们对这些变换方式有所了解。 二、正定矩阵补充 在上一节学习的正定矩阵的基础上&#xff0c;我们给出以下问题&#xff1a; &#xff08;1&…

2023年2月北京/广州/西安/深圳DAMA-CDGA/CDGP数据治理认证招生简章

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

uniapp:常用跨端业务组件

插件内组件包含以下功能&#xff1a; 自定义状态栏组件(ZoNavBar)上拉加载状态组件(ZoLoading)弹窗组件(ZoPopup)搜索组件(ZoSearchBar)空数据组件(ZoEmpty)tab标签组件(ZoTabs)tab下拉筛选组件(ZoSelectTabs)底部导航组件(ZoTabBar)cell导航组件(ZoCell) 10.标题内容组件(ZoT…

复试--数据结构篇[1-4章]

目录第一章 绪论第二章 线性表1-线性表的顺序表示&#xff08;顺序表&#xff09;2-线性表的链式表示&#xff08;链表&#xff09;&#xff08;1&#xff09;单链表&#xff08;2&#xff09;循环链表&#xff08;3&#xff09;双向链表3-顺序表和链表的比较4-线性表的应用第三…

Hyper-V中的虚拟机双网卡配置

Hyper-V中的虚拟机双网卡配置 在虚拟机交换管中 存在三种虚拟交换机分别是外部、内部和专用 内部网络&#xff1a;虚拟机与虚拟机访问宿主机&#xff0c;虚拟机可以访问物理网络 外部网络&#xff1a;虚拟机与虚拟机之间&#xff0c;虚拟机与宿主机之间&#xff0c;虚拟机或宿…

大数据学习路线

学习建议 #1、Java 这个没毛病&#xff0c;看 Java 程序员进阶之路就好了&#xff0c;Spring Boot 也要能掌握 #2、MySQL 要能写复杂的 SQL 语句&#xff0c;为后面学习 Hive 数仓的 HQL 打好基础。 #3、Linux 大数据的相关软件都是在 Linux 上运行的&#xff0c;所以 Linux …