lc15.三数之和

news2024/11/27 2:47:27

暴力解法:三层for循环,每个循环指向一个变量,求所有的和为零的情况

时间复杂度:O(n3)

空间复杂度:O(1)

双指针

1、对数组进行排序

2、外层循环控制第一个数 i;第一个数的范围必须保证小于等于0,若是第一个数大于零,后面的两个数都大于0,不可能实现三数和为零的情况

3、内层循环,控制第二个数 j 的指针初始为 i+1,从前向后遍历;第三个数为最后一个数k

初始为nums.length-1,从后向前遍历。此时计算nums[i]+nums[j]+nums[k]三数之和,将三数之和为0的i、j、k存入集合之中

4、同时存在有相等的数,当存在相同的数时,另一指针先不动,直到相同的数遍历完成为止

时间复杂度:O(n2)

空间复杂度:O(1)

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ThreeSum {

    @Test
    public void test() {
        int[] nums = new int[]{-1, 0, 1, 2, -1, -4};
        //[-4,-1,-1,0,1,2]
        int[] nums1 = new int[]{0, 0, 0};
        for (int i = 0; i < threeSum(nums1).size(); i++) {
            System.out.println(threeSum(nums1).get(i));
            //[-1,-1,2],[-1,0,1]
        }
    }

    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        int i = 0;
        while (nums[i] <= 0 && i <= nums.length - 3) {//小于倒数第二个数

            int j = i + 1, k = nums.length - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];

                if (sum == 0 && !result.contains(Arrays.asList(nums[i], nums[j], nums[k]))) {
                    result.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    //处理数字相等时的情况
                    //因为最后输出的nums数组中的值,不是索引,所以数字相同可以直接跳过
                    while (j < k && nums[j] == nums[j + 1]) {//j < k避免nums =[0,0,0]的情况下标越界
                        j++;
                    }
                    while (j < k && nums[k] == nums[k - 1]) {
                        k--;
                    }
                    //根据sum的值来调整j和k的位置
                } else if (sum < 0) {//sum<0说明三数之和较小,需要增大
                    j++;
                } else {//sum>0说明三数之和较大,需要减小
                    k--;
                }
            }
            i++;
        }
        return result;
    }
}

因为!result.contains(Arrays.asList(nums[i], nums[j], nums[k]))的判断在数据量大的时候判断相当占用时间,因此数据量大的时候会报超时

要想在不进行判断是否能够被存入数组,就需要保证在遍历的时候跳过i、j、k三个指针所有指向的相同的数据。因此All Perfect代码对第一、二、三个数都排除了相同数据的情况

反之,可以得出,在不排除相同的数据时,对于每一组数在进入集合前,都需要判断是否能够被存入集合。但contains一多整个代码跑的就慢

All Perfect代码

class Solution {
    public List<List<Integer>> threeSum1(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {//第一个数i
            if (nums[i] > 0) {//大于0时退出循环
                break;
            }
            if (i > 0 && nums[i] == nums[i - 1]) {//如果相同,直接执行下一个
                //因为最后输出的nums数组中的值,不是索引,所以数字相同可以直接跳过
                continue;
            }
            int l = i + 1, r = nums.length - 1;
            while (l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == 0) {
                    res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    //处理相同的数的情况
                    //因为最后输出的nums数组中的值,不是索引,所以数字相同可以直接跳过
                    while (l < r && nums[l] == nums[++l]) ;
                    while (l < r && nums[r] == nums[--r]) ;
                } else if (sum < 0) {
                    l++;
                } else {
                    r--;
                }
            }

        }
        return res;
    }
}

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

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

相关文章

嘉楠勘智k230开发板上手记录(五)--nncase部署yolov5s

虽然没有找到hhb的官方示例&#xff0c;但是我找到了nncase的&#xff0c;在src/big/nncase/examples中 一、环境搭建 examples也有个readme&#xff0c;不过里面的环境搭建跟sdk中的有点差别&#xff0c;不过大差不差&#xff0c;docker容器已经启动了&#xff0c;需要在容器…

python 书籍

python高手进阶之路 10册 QQ:417398600

通过SunFlower学习Hilt基本使用

文章目录 添加hilt配置数据库自动注入常规kotlin 规范创建AppDatabase、表、查询封装Dao创建DatabaseModule&#xff0c;向外提供数据库访问方法InstallIn和Provider上Scope关系PlantRepository 使用 PlantDaoViewModel使用PlantRepositoryFragment声明需要进行注入sunflower 仓…

藏语翻译器:多功能翻译软件

这是是一款能够将藏语翻译成其他语言或将其他语言翻译成藏语的软件。该软件能够识别并翻译藏语中的常用词汇和短语&#xff0c;并且支持多种常见语言的翻译&#xff0c;例如英语、汉语、法语、德语等等。此外&#xff0c;藏语翻译器还具有简单易用的用户界面&#xff0c;方便用…

ASEMI快恢复二极管APT60DQ20BG参数规格

编辑-Z APT60DQ20BG参数描述&#xff1a; 型号&#xff1a;APT60DQ20BG 最大峰值反向电压(VRRM)&#xff1a;200V 最大直流阻断电压VR(DC)&#xff1a;200V 平均整流正向电流(IF)&#xff1a;60A 非重复峰值浪涌电流(IFSM)&#xff1a;300A 工作接点温度和储存温度(TJ, …

Spring5学习笔记— 工厂高级特性

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

RestTemplate 请求转发异常 ERR_CONTENT_DECODING_FAILED 200 (OK)

#1 问题描述 在基于Spring Boot的项目中实现了请求转发&#xff08;使用 RestTemplate 的 exchange 方法&#xff09;的功能&#xff0c;忽然在前端报net::ERR_CONTENT_DECODING_FAILED 200 (OK)的错误&#xff0c;后端及上游系统日志均显示请求已完成。 #2 原因探寻 上述错…

黑马机器学习day3

1.线性回归 1.1线性回归的原理 线性关系 非线性关系 1.2线性回归的损失和优化原理 目标&#xff1a;求模型参数&#xff0c;模型参数能够使预测准确 1损失函数 2优化方法 正规方程&#xff1a;直接求解W梯度下降&#xff1a;试错&#xff0c;改进 1.3线性回归API 1线性回…

http、https笔记

目录 HTTP 基本概念状态码&#xff1a;get和post的区别&#xff1a;http 常⻅字段&#xff1a;http的缺点&#xff1a; HTTP/1.1HTTP/3HTTPSHTTPS和HTTP区别对称加密和⾮对称加密⾮对称加密 HTTP 基本概念 状态码&#xff1a; 1xx 中间状态&#xff0c;比如post的continue 20…

端口输入的数据为什么要打拍?

一次作者在开发图像时候&#xff0c;对输入的图像没有打拍&#xff0c;输出给显示终端&#xff0c;时好时坏&#xff0c;或者图像颜色不正确&#xff0c;最终经过打拍解决了此问题。 //配置为16-Bit SDR ITU-R BT.656模式时pixel_data[23:16]为高阻。always (posedge pixel_cl…

「文本隐写」相关会议期刊投稿注意事项

前言&#xff1a;本篇博客总结「文本隐写」研究领域相关会议与期刊的投稿注意事项。 目录 一、会议ACL (The Annual Meeting of the Association for Computational Linguistics)IH&MMSec (The ACM Workshop on Information Hiding, Multimedia and Security)CCS (The ACM …

ABAP通过弹窗函数POPUP_GET_VALUES修改数据内容

我们通过调用内置函数POPUP_GET_VALUES来实现弹框数据某些对应的数据内容. 具体参数以及语法如下. CALL FUNCTION POPUP_GET_VALUESEXPORTING * NO_VALUE_CHECK popup_title 物料商品选择 * START_COLUMN 5 * START_ROW 5IMPORTINGreturn…

opencv基础55-获取轮廓的特征值及示例

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比&#xff08;AspectRation&#xff09;来描述轮廓&#xff0c;例如矩形轮廓的宽高比为&#xff1a; 宽高比 宽度&am…

Linux系统介绍

一、Linux系统和Windows系统的区别&#xff1a; 1.Linux主要使用命令行来操作系统&#xff0c;Windows是使用图形化界面来操作系统。 在Linux系统中可以通过在桌面鼠标右击选择在终端中打开然后通过终端来操作&#xff0c;也可以使用快捷键ctrlaltt进入终端&#xff1b;可以直…

修改el-select和el-input样式;修改element-plus的下拉框el-select样式

修改el-select样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …

CSGO搬砖会被红锁吗?不清楚这些的话steam搬砖大家千万别做。

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 在CSGO游戏中&#xff0c;许多玩家通过搬砖赚钱。小编整理了相关资料。让我们看看&#xff0…

单芯片3路CC管理的VR转接器解决方案

VR眼镜即VR头显&#xff0c;也称虚拟现实头戴式显示设备&#xff0c;随着元宇宙概念的传播&#xff0c;VR眼镜的热度一直只增不减&#xff0c;但是头戴设备的续航一直被人诟病&#xff0c;如果增大电池就会让头显变得笨重影响体验&#xff0c;所以目前最佳的解决方案还是使用VR…

微信开发之一键修改好友标签的技术实现

移除标签下的好友&#xff1a; 把需移除的好友所有标签查出来&#xff08;通讯录详情接口返回标签id&#xff0c;数据库需缓存&#xff09;&#xff0c;去掉想移出的标签id&#xff0c;labelIdList参数放进其他所有标签id。 增加标签新好友&#xff1a; 把需添加的好友所有标签…

STM32入门——ADC模数转换

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…

数据结构---B树

目录标题 B-树的由来B-树的规则和原理B-树的插入分析B-树的插入实现准备工作find函数insert中序遍历 B-树的性能测试B-树的删除B树B树的元素插入B*树的介绍 B-树的由来 在前面的学习过程中&#xff0c;我们见过很多搜索结构比比如说顺序查找&#xff0c;二分查找&#xff0c;搜…