NSUM 问题

news2025/1/13 13:35:46

目录标题

    • 两数之和
    • 两数之和 2(多个结果集去重)
    • 15. 三数之和

两数之和

问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例1

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

示例2

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:24 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3]

示例3

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-10 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2]

代码

static int[] twoSum(int[] nums, int target) {
    int l = 0;
    int r = nums.length - 1;
    while (l < r) {
    	//整体数字偏小,l右移
        if (nums[l] + nums[r] < target) {
            l++;
            //整体数字偏大,r左移
        } else if (nums[l] + nums[r] > target) {
            r--;
        } else {
            return new int[]{l, r};
        }
    }
    return null;
}

两数之和 2(多个结果集去重)

问题描述
nums 中可能有多对儿元素之和都等于 target,请你的算法返回所有和为 target 的元素对儿,其中不能出现重复。
示例

nums = [1,3,1,2,2,3], target = 4
结果:[[1,3],[2,2]]

思路
出问题的地方在于 sum == target 条件的 if 分支,当给 res 加入一次结果后,l 指针和 h 指针不应该直接修改,还应该跳过所有重复的元素。
在这里插入图片描述
代码1:指针偏移的时候校验

static List<List<Integer>> twoSum(int[] nums, int target) {
    List<List<Integer>> result = new ArrayList<>();

    Arrays.sort(nums);

    int l = 0;
    int r = nums.length - 1;
    while (l < r) {
        int numL = nums[l];
        int numR = nums[r];

        //整体数字偏小,l右移
        if (numL + numR < target) {
            while (l < r && nums[l] == numL) {
                l++;
            }
            //整体数字偏大,r左移
        } else if (numL + numR > target) {
            while (l < r && nums[r] == numR) {
                r--;
            }
        } else {
            result.add(Arrays.asList(numL, numR));
            //l指针跳过与当前值相同的下标
            while (l < r && nums[l] == numL) {
                l++;
            }
            //r指针跳过与当前值相同的下标
            while (l < r && nums[r] == numR) {
                r--;
            }
        }
    }
    return result;
}

代码2:返回值用set去重

static Set<List<Integer>> twoSum(int[] nums, int target) {
    Set<List<Integer>> result = new HashSet<>();

    Arrays.sort(nums);

    int l = 0;
    int r = nums.length - 1;
    while (l < r) {
        int numL = nums[l];
        int numR = nums[r];

        //整体数字偏小,l右移
        if (numL + numR < target) {
            l++;
            //整体数字偏大,r左移
        } else if (numL + numR > target) {
            r--;
        } else {
            result.add(Arrays.asList(numL, numR));
            l++;
            r--;
        }
    }
    return result;
}

15. 三数之和

问题描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

代码

static Set<List<Integer>> threeSum(int[] arr) {
    //set可以自动去重结果集
    Set<List<Integer>> result = new HashSet<>();
    //数据排序
    Arrays.sort(arr);
    //以arr[i]为基准数,利用左右指针遍历其他两个值
    for (int i = 0; i < arr.length; i++) {
        int l = i + 1;
        int r = arr.length - 1;

        while (l < r) {
            //如果三个数之和小于0,则左指针右移,整体增大
            if (arr[i] + arr[l] + arr[r] < 0) {
                l++;
                //如果三个数之和大于0,则右指针左移,整体减少
            } else if (arr[i] + arr[l] + arr[r] > 0) {
                r--;
            } else {
                //如果三个数之和等于0,则右指针左移,左指针右移,继续找下一组数据
                result.add(Arrays.asList(arr[i], arr[l], arr[r]));
                l++;
                r--;
            }
        }
    }
    return result;
}

来源:https://mp.weixin.qq.com/s/fSyJVvggxHq28a0SdmZm6Q

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

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

相关文章

基于Java(JSP)+MySQL实现(Web)学生成绩综合管理系统【100010065】

Java 课程设计:师生交流系统 1.1 课设题目 信息商务学院学生成绩综合管理系统的综合与开发 2.1 课设目的 《Java 程序设计》课程是计算机专业的一门专业必修课程&#xff0c;针对课程进行为期两周的实践教学&#xff0c;旨在提升本专业学生对此课程中的理论知识的综合应用能…

[Python学习系列] 走进Django框架

文章目录1. 安装django2. 创建项目&#xff08;命令的方式&#xff09;在第一次创建django项目需要做的&#xff1a;每一次创建django项目需要做的&#xff1a;3. 创建app4. 启动运行django项目程序5. 模板&静态文件的存放地址6. django中的模板语法7. django中常见的请求和…

ArcGIS基础实验操作100例--实验4矢量要素的镜像复制,缩放

实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验4 矢量要素的镜像复制&#xff0c;缩放 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&#xff09;加载【Mirror Features】工具 &#x…

VMware之安装Windows10系统

系统下载 下载地址&#xff1a;原版软件 (itellyou.cn) 创建虚拟机系统框架 在菜单栏中选择文件下的新建虚拟机 选择自定义&#xff0c;然后点击下一步 直接下一步 选择稍后安装操作系统&#xff0c;然后点击下一步 因为安装的系统是Windows&#xff0c;这里注意选择Microsof…

使用eBPF追踪Linux内核

简介 BPF&#xff0c;及伯克利包过滤器Berkeley Packet Filter&#xff0c;最初构想提出于 1992 年&#xff0c;其目的是为了提供一种过滤包的方法&#xff0c;并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成&…

浏览器:理解HTTP无状态与Cookie的使用

一、理解HTTP无状态 1.1、理解http无状态 http无状态是指协议对于用户身份、用户状态、用户权限、交互场景等没有记忆能力。简单讲就是不能识别用户。 1.2、http无状态的优点&#xff1a; 可以更快地处理大量的事务&#xff0c;确保协议的可伸缩性&#xff0c;减少服务器的…

一文搞定十大排序算法(动画图解)

排序的定义 排序&#xff0c;就是重新排列表中的元素&#xff0c;使表中的元素满足按关键字递增或递减的过程。为了査找方便&#xff0c;通常要求计算机中的表是按关键字有序的。 排序的确切定义如下&#xff1a; 算法的稳定性&#xff1a; 若待排序表中有两个元素 Ri 和 Rj&am…

包装类和简单认识泛型

目录 1.包装类 1.1基本数据类型和对应的包装类 1.2装箱和拆箱 1.3自动装箱和自动拆箱 2.什么是泛型 3.引出泛型 3.1语法 4.泛型类的使用 4.1语法 4.2类型推导 5.裸类型 5.1说明 6.泛型如何编译的 6.1擦除机制 6.2为什么不能实例化泛型类型的数组 7.泛型的上界 …

MaxKey单点登录认证系统3.5.12发布,重要漏洞修复

业界领先的IAM/IDaas身份管理和认证产品 概述 MaxKey单点登录认证系统&#xff0c;谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM/IDaas身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议&#xff0c;提供安全、标准和开放的用户身份…

STM32/51单片机实训day3——点亮LED灯、闪烁LED灯(二)实践

内 容&#xff1a;编写代码实现LED灯的点亮功能 学 时&#xff1a;2学时 知识点&#xff1a;分析原理图、LED灯控制原理 重点&#xff1a;GPIO参数配置、LED原理图分析 难点&#xff1a;编写 GPIO参数配置函数、LED点亮函数 时间&#xff1a;2022年12月21日 9:00&#xff5e;…

如何轻松做数据治理?开源技术栈告诉你答案

搭建一套数据治理体系耗时耗力&#xff0c;但或许我们没有必要从头开始搞自己的数据血缘项目。本文分享如何用开源、现代的 DataOps、ETL、Dashboard、元数据、数据血缘管理系统构建大数据治理基础设施。 元数据治理系统 元数据治理系统是一个提供了所有数据在哪、格式化方式…

vue2.0中集成并使用ueditor,解决第一次编辑器正常加载,第二次就不加载的问题,父组件调用子组件的方法

vue2.0中集成并使用ueditor 最近有项目需要使用编辑器&#xff0c;就找了一款百度的ueidtor编辑器&#xff0c;第一次用各种不会&#xff0c;所以记录一下 下面的链接就是ueditor的前后端的配置说明和API等 链接: ueidtor的API 下载ueidtor 下载最新版的1.5.0版本&#xf…

基于Flask+bootstrap+sqlite开发宝宝成长管理系统,宝宝成长记录系统源码

BabyLog 岁月如风&#xff0c;唯有此忆, 任凭时光匆匆&#xff0c;记录点点滴滴。 当爸爸了&#xff0c;就多陪陪孩子&#xff0c;有事没事的记些东西&#xff0c;不要总把心思放在程序编码上&#xff0c;也多陪陪孩子&#xff01; 记录了那么多条数据&#xff0c;是时候也为…

Linux之Shell脚本学习笔记(持续更新中......)

Shell是什么 命令解释器。为用户提供了一个向Linux内核发送请求一i按运行程序的界面系统级程序。 Shell编程快速入门 脚本格式要求 脚本以#!/bin/bash开头脚本需要有可执行权限 编写脚本&#xff0c;输出HelloWorld 编写 #!/bin/bash echo "hello world!"执行 …

Stm32开发1-蓝牙实现STM32的无线烧写程序 ISP模式 串口1不受影响 无线下载

最近研究如何实现Stm32的无线烧写程序。从CSDN上看到大部分的无线烧写方法&#xff0c;大都是采用ESP8266CMSIS-DAP的方式&#xff0c;其能下载也能调试程序&#xff0c;也能通过虚拟串口通信。但是其串口应该是用软件实现的&#xff0c;会占用系统资源&#xff0c;对于其能否实…

【unity3D】DoTween动画插件(上)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的DoTween动画插件 DoTween动画插件&#xff08;上&#xff09;基础知识一些常用方法DOMove和DoLocalMovefrom TerrnsDOText打字机…

JavaScript篇.day04-函数, 对象类型

目录 1.函数 2.对象类型 3.例题 (1)斐波拉契数列(递归) (2)猴子吃桃(递归) (3)求100内的数之和(递归) 1.函数 函数: 是完成某个功能的代码块 函数声明 function 函数名(){ }function 函数名(形参1, 形参2...){ }函数表达式: var 函数名 function(){ } 匿名函数 …

springdata-Jpa-04原理

Repository原理 核心机制&#xff1a; 动态代理 &#xff1a; JdkDynamicAopProxy#invoke 调用JPA的Repository统一实现 SimpleJpaRepository 就是去通过JPA的API完成的持久化操作 Spring整合jpa原理 Spring怎么管理Repository( 怎么创建的Repository的Bean) 1.EnableJpaRep…

多线程与高并发(15)——线程池详解(非源码层面)

通过之前的一篇文章&#xff0c;我们总结了Executor框架。而在Executor框架中&#xff0c;ThreadPoolExecutor 是最核心的类。 ThreadPoolExecutor 看字面意思&#xff0c;是线程池的执行器。我们本篇文章就基于ThreadPoolExecutor 这个类来展开总结线程池。 下篇文章会从源码的…

java之线程同步和线程之间的通信

线程同步的概念&#xff1a; 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时,也会带来访问冲突的问题&#xff1a; 举例&#xff1a; public class Runnable_test implements Runnable {//实现Runnable接口 private int ticknumbers10;Overridepublic void …