力扣 --- 三数之和

news2024/10/7 8:27:33

目录

题目描述:

思路描述:

代码:

提交结果:

官方代码:

官方提交结果:


题目描述:

给你一个整数数组 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 。

思路描述:

        对于这个题,我们很容易想到一个非常简单的方法,就是用三层遍历,每一层代表一个数,暴力求解所有结果,选出其中符合条件的组合。此方法虽然简单,但是,时间复杂度比较高,因此,该方法用于提交力扣,是通不过的。

        我们可以换一种其他的思路,我们可以将其转换成,两个数之和为另一个数的相反数的思路来解决这个题目。

        第一个索引表示第一个数,从前往后遍历,要遍历到倒数第三个,因为遍历到倒数第一第二的位置,是没有必要的,因为不够三个的数目。

        第二个索引表示第二个数,初始为第一个数的下一位索引,第三个索引表示第三个数,初始为数组末端的元素,从第二个索引和第三个索引之间的位置找出两个数的和为第一个数的相反数的两个数。

        如何操作第二和第三索引?如果数组是有序的,我们很容易来遍历,即两个索引的元素之和大于第一个数的相反数,就让第三索引减小,如果等于,说明是一个符合条件的组合,如果小于,就让第二索引增加。

        因此,开头,我们要现将数组进行排序,这样,后续操作就变的非常简单。

代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result=new ArrayList<>();
        Arrays.sort(nums);//排序
        for(int i=0;i<nums.length-2;i++){//第一索引遍历
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            if(nums[i]>0){//第一数是整数,就无须再遍历
                break;
            }
            int item=-nums[i];
            int left=i+1;
            int right=nums.length-1;
            while(left<right){//双指针进行遍历
                if(nums[left]+nums[right]==item){
                    List<Integer> myList=new ArrayList<>();
                    myList.add(nums[i]);
                    myList.add(nums[right]);
                    myList.add(nums[left]);
                    result.add(myList);
                    while(left<right && nums[left]==nums[left+1]){
                        left++;
                    }
                    left++;
                    while(right>left && nums[right]==nums[right-1]){
                        right--;
                    }
                    right--;
                }else if(nums[left]+nums[right]<item){
                    left++;
                }else{
                    right--;
                }
            }
        }
        return result;
    }
}

提交结果:

官方代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        // 枚举 a
        for (int first = 0; first < n; ++first) {
            // 需要和上一次枚举的数不相同
            if (first > 0 && nums[first] == nums[first - 1]) {
                continue;
            }
            // c 对应的指针初始指向数组的最右端
            int third = n - 1;
            int target = -nums[first];
            // 枚举 b
            for (int second = first + 1; second < n; ++second) {
                // 需要和上一次枚举的数不相同
                if (second > first + 1 && nums[second] == nums[second - 1]) {
                    continue;
                }
                // 需要保证 b 的指针在 c 的指针的左侧
                while (second < third && nums[second] + nums[third] > target) {
                    --third;
                }
                // 如果指针重合,随着 b 后续的增加
                // 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
                if (second == third) {
                    break;
                }
                if (nums[second] + nums[third] == target) {
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    ans.add(list);
                }
            }
        }
        return ans;
    }
}

官方提交结果:

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

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

相关文章

【虚拟机】Docker基础 【二】

2.2.数据卷 容器是隔离环境&#xff0c;容器内程序的文件、配置、运行时产生的容器都在容器内部&#xff0c;我们要读写容器内的文件非常不方便。大家思考几个问题&#xff1a; 如果要升级MySQL版本&#xff0c;需要销毁旧容器&#xff0c;那么数据岂不是跟着被销毁了&#x…

vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

面试官&#xff1a;vue要做权限管理该怎么做&#xff1f;如果控制到按钮级别的权限怎么做&#xff1f; 一、是什么 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权&#xff0c;请求…

上海震坤行被评为虹桥生产线互联网服务高质量发展平台

上海震坤行被评为虹桥生产线互联网服务高质量发展平台 10月12日&#xff0c;新一期“潮涌浦江投资虹桥”活动暨“战略赋能新机遇&#xff0c;开放引领新高地”——2023虹桥国际中央商务区投资促进大会在上海虹桥举行。 本次活动旨在释放关于推动虹桥国际开放枢纽进一步提升能级…

Attention机制(笔记)

参考&#xff1a;2.3.2注意力机制-part1_哔哩哔哩_bilibili 什么是attention&#xff1f; 答&#xff1a;注意力放在事物最有辨识度的部分 attention计算机制&#xff1a; 为什么用这个公式可以得到attention&#xff1f; 补充说明&#xff08;chatGPT给出的解释&#xff09;&…

Vue中 实现自定义指令(directive)及应用场景

一、Vue2 1. 指令钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选)&#xff1a; bind 只调用一次&#xff0c;指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted 被绑定元素插入父节点时调用 (仅保证父节点存在&#xff0c;但不一定已…

高等数学中微分方程的种类及其解法

1 微分方程的基本概念 1.1 微分方程 含导数或微分的方程,称为微分方程 1.2 微分方程的阶 微分方程中所含的导数或微分的最高阶数,称为该微分方程的阶数 1.3 微分方程的解 使得微分方程成立的函数,称为微分方程的解,微分方程的解可分为通解和特解 不含任意常数的微分方程的…

正式确定,奥特曼重回 OpenAI 担任 CEO

今天&#xff0c;OpenAI 正式宣布山姆奥特曼回归 OpenAI&#xff0c;重新担任 CEO&#xff1a; 米拉将回归首席技术官职位&#xff08;CTO&#xff09;而新的初步董事会成员包括布雷特泰勒&#xff08;主席&#xff09;、拉里萨默斯和亚当D’安杰洛。经此一役&#xff0c;可以…

Java核心知识点整理大全23-笔记

目录 21. JAVA 算法 21.1.1. 二分查找 21.1.2.冒泡排序算法 21.1.3. 插入排序算法 21.1.4. 快速排序算法 21.1.1. 希尔排序算法 21.1.2. 归并排序算法 21.1.3. 桶排序算法 21.1.4. 基数排序算法 21.1.5. 剪枝算法 21.1.6. 回溯算法 21.1.7. 最短路径算法 21.1.8. 最…

用java实现拼图小游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

请大数据把奥威BI分析工具推给每一个财务!

这个财务指标怎么算&#xff1f;那些数据什么时候能拿到&#xff1f;看完报表&#xff0c;发现某部门上个月的支出涨幅过大&#xff0c;想了解原因怎么办&#xff1f;……财务人&#xff0c;你是不是每个月都把时间消耗在这些事情上了&#xff1f;那你可得快接住这个BI大数据分…

ROM和RAM概念

一、存储器特性 1&#xff09;易失性&#xff1a;掉电数据会丢失&#xff0c;通常指RAM&#xff1b; RAM分为SRAM、DRAM SRAM&#xff1a;静态RAM&#xff0c;只要上电数据就不会丢失&#xff1b; DRAM&#xff1a;动态RAM&#xff0c;需要每隔一段事件刷新数据&#xff0c;否…

基于安卓的2048益智游戏的设计与实现

基于安卓的2048益智类游戏的设计与实现 摘要&#xff1a;现如今随着社会日新月异&#xff0c;人们越来越离不开智能手机所提供的灵活性与便携性。安卓系统是在这股手机发展迅猛的潮流中其市场占有率过半的手机平台&#xff0c;基于安卓系统的游戏开发有着不可估量的前景。 本论…

CSS特效022:小球抛物线效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

中国版的 GPTs:InsCode AI 生成应用

前言 在上一篇文章 《InsCode&#xff1a;这可能是下一代应用开发平台&#xff1f;》中&#xff0c;我们介绍了一个新的应用开发平台 InsCode&#xff0c;它是基于云原生开发环境 云 IDE AI 辅助编程的一站式在线开发平台。 最近&#xff0c;InsCode 又推出了另一种全新的开…

科研学习|论文解读——Task complexity and difficulty in music information retrieval

摘要&#xff1a; 关于音乐信息检索&#xff08;MIR&#xff09;中任务复杂度和任务难度的研究很少&#xff0c;而文本检索领域的许多研究发现任务复杂度和任务难度对用户效率有显着影响。本研究旨在通过探索 i) 任务复杂度和任务难度之间的关系&#xff1b; ii) 影响任务难度的…

Linux系统的常见命令十,打包以及解包、链接(tar、ln)

目录 tar命令ln命令 本文主要介绍Linux系统的打包以及解包、链接命令tar、ln。 gzip 和bzip2只能压缩文件&#xff0c;但是不能压缩目录。而zip可以压缩文件也可以压缩目录但是解压过后内容全部都丢失了。打包就是把一些零零散散的东西全部都堆到一起。 tar命令 tar&#xff…

如何运用智能安全帽、执法记录仪等技术手段提高隧道施工人员定位和安全监管效率?

应用需求 隧道中通常没有4G网络&#xff0c;无法搜到GPS卫星&#xff0c; 而领导从安全生产监管的角度&#xff0c;又需要看到现场的视频、录像、人员定位等。这正是本方案需要解决的问题。 系统特点 在无网络的隧道内部录像&#xff0c;紧急情况可派人出隧道&#xff0c;把…

svn合并冲突时每个选项的含义

合并冲突时每个选项的含义 - 这个图片是 TortoiseSVN&#xff08;一个Subversion&#xff08;SVN&#xff09;客户端&#xff09;的合并冲突解决对话框。当你尝试合并两个版本的文件并且出现差异时&#xff0c;你需要解决这些差异。这个对话框提供了几个选项来处理合并冲突&…

挑战传统IT:RPA以更低的成本和更高的效率领跑数字化转型

在企业数字化进程中&#xff0c;传统的IT解决方案往往带来高成本和低效率的问题。因此&#xff0c;如何顺利地、平稳地进行数字化转型对企业来说是核心考虑。 为此&#xff0c;本文将深入探讨RPA&#xff08;Robotic Process Automation&#xff09;如何以其独特的优势&#xf…

map文件解析

Map文件内容分为以下五段&#xff1a; 1&#xff09;Section Cross References&#xff1a;模块、段(入口)交叉引用&#xff1b;(ASR编译生成的map文件没有输出该段信息) 2&#xff09;Removing Unused input sections from the image&#xff1a;移除未使用的模块&#xff1…