LeetCode_Day7 | 三数之和、四数之和

news2024/10/6 2:26:16

LeetCode_哈希表

  • 15.三数之和
    • 1.题目描述
    • 2.双指针法
      • 2.1思路及注意点
      • 2.2代码实现
    • 3.哈希法(有待修正)
      • 3.1 思路
      • 3.2 代码实现
  • 18.四数之和
    • 1. 题目描述

15.三数之和

1.题目描述

在这里插入图片描述
在这里插入图片描述
详情leetcode链接

2.双指针法

2.1思路及注意点

  • 将数组排序,有一层for循环,i从下标0开始,同时定义一个下标left在i+1的位置上,定义下标right在数组末尾位置。
  • 依次在数组中找到abc,使得a + b +c =0,这里相当于 a =nums[i],b = nums[left],c = nums[right]。
  • 若nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
  • 若nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left向右移动,才能让三数之和大一些,直到left与right相遇为止。

去重注意:
因为本题要求不能重复的三元组,所以需要对每个数进行去重。

最外层for循环对a去重时,错误写法:if条件为nums[i]=nums[i+1],这样判断的是结果集中是否有重复元素,会误跳过结果集
正确写法:if条件为nums[i]=nums[i-1],举例{-1,-1,2}

b和c去重时,应该在找到一个三元组后进行去重

2.2代码实现

/**
 * 双指针法:(推荐)
 * 思路:
 *   将数组排序,有一层for循环,i从下标0开始,同时定义一个下标left在i+1的位置上,定
 * 义下标right在数组末尾位置,依次在数组中找到abc,使得a + b +c =0,这里相当于 a =
 * nums[i],b = nums[left],c = nums[right]。
 *   若nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是
 * 排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
 *   若nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left向右移
 *动,才能让三数之和大一些,直到left与right相遇为止。
 *    
 * 时间复杂度:O(n^2)
 * 空间复杂度:O(1) 
 *  */
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; i++) {
            //因为对结果集进行了排序,若第一个大于0,则必然不会组成规定的三元组
            if (nums[i]>0){
                return result;
            }
            // 错误去重a方法,将会漏掉-1,-1,2 这种情况
            /*
            if (nums[i] == nums[i + 1]) {
                continue;
            }
            */
            //正确去重方法
            if (i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.length - 1;
            //边界条件考虑:若left = right,b和c相当于同一个数,不符合题意
            while (right > left){
                int sum = nums[i] + nums[left] + nums[right];
                if (sum > 0){
                    right --;
                }else if (sum < 0) {
                    left ++;
                }else {
                    result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    //当找到一个三元组后,对b和c去重
                    while (right > left && nums[left]==nums[left+1]) left++;
                    while (right > left && nums[right]==nums[right-1]) right--;
                    left ++;
                    right --;
                }
            }
        }
        return result;
    }
}

3.哈希法(有待修正)

3.1 思路

  • 两层for循环就可以确定 a 和b 的数值了,然后使用哈希法来确定 0-(a+b) 是否在 数组里出现过
  • 因为结果数组中不包含重复的三元组,所以需要依次对三个数进行去重及对结果去重

3.2 代码实现

/**
 * 暴力法:双层for循环(不推荐)
 * 思路:两层for循环就可以确定 a 和b 的数值了,
 *       然后使用哈希法来确定 0-(a+b) 是否在 数组里出现过,
 *       因为结果数组中不包含重复的三元组,所以需要依次对三个数进行去重及对结果去重
 *       此法代码编写时间复杂度高且需要去重考虑的细节很多,复杂不推荐
 * 时间复杂度:O(n^2)
 * 空间复杂度:O(n) //额外的set开销
 *
 */
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        Set<Integer> set = new HashSet<>();
        Set<Integer> filter = new HashSet<>();
        for (int i = 0; i < nums.length; i++){
            if (nums[i] > 0){//若数组的第一个数大于0,直接返回
                return result;
            }
            if (i > 0 && nums[i]==nums[i-1]){//对第一个数去重
                continue;
            }
            for (int j = i + 1; j < nums.length; j++){
                if (j > i+1 && nums[j]==nums[j-1]){//对第二个数去重
                    continue;
                }
                int third = 0 - (nums[i] + nums[j]);
                if (set.contains(third) && !filter.contains(nums[j])){
                    List<Integer> singResult = new ArrayList<>();
                    singResult.add(nums[i]);
                    singResult.add(nums[j]);
                    singResult.add(third);
                    result.add(singResult);
                    set.remove(third);//对第三个数去重
                    filter.add(third);//防止有重复的集合
                }else {
                    set.add(nums[j]);
                }
            }
        }
        return result;
    }
}

18.四数之和

1. 题目描述

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

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

相关文章

uniapp 中 引入vant组件 和 vant 报错Unclosed bracket 的问题解决

在uniapp 中引入vant组件&#xff0c;遇到一个报错&#xff0c;所以在此记录一下完整过程 一、引入vant组件 方式一&#xff1a;前往 GitHub官网 Vant 下载压缩文件&#xff0c;获取下载中的dist 文件 方式二&#xff1a;通过npm install 方式引入 npm i vant/weapp -S --pr…

【Android开发日常】一文弄懂桌面图标快捷菜单 桌面小组件

本文将介绍如何创建和管理应用快捷方式、如何创建和管理应用桌面小组件。 目录 一、桌面菜单1.1 概览1.2、为什么需要桌面图标快捷菜单1.3、如何实现桌面图标快捷菜单1.3.1 创建静态快捷方式1.3.2 创建动态快捷方式1.3.3 创建固定快捷方式1.3.4 使用快捷方式的最佳做法 1.4 注…

DOTA-c(RGDyK)和DOTA-cyclo(RGDyK)对αVβ3的亲和力和选择性的影响

&#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09; ●英文名&#xff1a;DOTA-cyclo(RGDyK)&#xff0c;DOTA-c(RGDyK) ●外观以及性质&#xff1a; DOTA-cyclo(RGDyK)中Cyclo(RGDyK)作用于αVβ3比作用于αVβ5和αIIbβ3表现更高的亲和力…

Prometheus 指标存储 观测 dubbo /windows_exporter指标 windows 版本 其他系统换个语法思路一样

目录 下载 Prometheus 访问Prometheus Targets 发现服务 对应的 dubbo 指标就出来了 Dubbo脚手架生成个最简单的项目 导入 Prometheus 相关包 或者使用这个包即可 启动后就自动上报指标了 Windows_exporter or node_exporter 端口 9182 Prometheus 配置 windows_exp…

第37节:cesium 下雪效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

SpringBoot - 在IDEA中经常发现:Could not autowire. No beans of ‘xxx‘ type found的错误

错误描述 在SPRINGBOOT的项目中&#xff0c;使用IDEA时经常会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示&#xff0c;但是程序的编译和运行都没有问题&#xff0c;这个错误提示并不影响项目的生产。 解决方案

Unity3D:专属 Inspector

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 专属 Inspector 专属 Inspector 是专门用于特定游戏对象、Unity 组件或资源的 Inspector 窗口。 它始终显示为其打开的项目的属性&#xff0c;即使您在场景或项目中选择了其他内容…

Flask框架之WTForms(详解)

目录 WTForms介绍和基本使用 WTForms介绍 基本使用 WTForms表单验证的基本使用 WTForms常用验证器 WTForms自定义验证器 场景&#xff1a;验证码实现 WTForms渲染模版 常用的方法 代码示例 WTForms介绍和基本使用 WTForms介绍 这个插件库主要有两个作用。 第一个是做…

十九、socket套接字编程(一)——UDP

文章目录 一、socket套接字编程接口&#xff08;一&#xff09;socket头文件&#xff08;二&#xff09;socket 常见API&#xff08;套接字编程接口&#xff09;1. 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器 )2.绑定网络信息 (TCP/UDP, 服务器 )3.开始监听 socket (TCP…

如何使用 OCI Artifacts、ORAS 和 Docker Hub 标准化软件交付

Docker Hub 是最著名的用于分发和共享容器映像的注册表。不过, Docker Hub 和其他符合 OCI 的注册表现在可以做的不仅仅是容器镜像。ORAS (OCI 注册表作为存储)项目将注册表转换为通用工件存储,能够发布与您的应用程序相关的任何资产。 在本文中,您将了解 ORAS 是什么、它…

echarts-热力图+高亮+轨迹

var mapData [{name: "北京",devicesCount: 100, //总数value: 10, //使用个数},{name: "天津",devicesCount: 50,value: 20,},{name: "上海",devicesCount: 80,value: 30,},{name: "重庆",devicesCount: 90,value: 40,},{name: "…

HOT28-两数相加

leetcode原题链接&#xff1a;两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

搭建mysql集群(Windows环境)

1、MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性&#xff0c;增强了安全性&#xff0c;使得单个MySQL服务器故障不会对系统产生巨大的负面效应&#xff0c;系统的稳定性得到保障。 MySQL群集需要有一组计算机&#xff0c;每台计算机的…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

COMSOL基于随机Voronoi骨架的三维多孔材料泡沫铝骨小梁模型力学分析

力学模型 模型计算为圆柱体试件轴压模型&#xff0c;在轴向荷载作用下应力分布的计算。 几何生成 采用CAD Voronoi3D插件在AutoCAD内直接生成三维Voronoi&#xff0c;其计算参数如下&#xff1a; 模型生成后删除晶格部件&#xff0c;并对晶粒进行一步平滑处理&#xff1a…

Centos7系统,虚拟机断电后启动报错:You might want to save “/run/initramfs/rdsosreport.txt“

虚拟机突然断电造成centos8系统无法启动 Linux报You might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot after mounting 1.解决方法&#xff1a; 大家可以用umr查看到自己装的镜像对应的以-root结尾的文件是哪个。因为大家装的镜像不同&#x…

多语言翻译node工具

多语言 i18n 翻译node工具 介绍 本文是为了方便使用 i18n的翻译工具&#xff0c;实现把excel的内容追加或更改到项目中的多语言文件中主要文件为 index.js 、test.txt 和 dist 文件夹内所有内容&#xff08;dist为项目中需要翻译的多语言文件&#xff0c;下面有例子&#xff…

有源、无源晶振的区别

在PCB设计中&#xff0c;晶振&#xff08;晶体振荡器&#xff09;是非常重要的电子元器件&#xff0c;相信大部分的PCB工程师对它都不会陌生。而对于有源晶振与无源晶振&#xff0c;很多人却是“傻傻分不清楚”。 我们知道&#xff0c;电子线路中的晶体振荡器分为无源晶振和有源…

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

如何配置git的.bashrc文件

1、进入到.git文件里&#xff1a;新建一个.bashrc文件 2、打开.bashrc文件添加配置信息&#xff1a; 代码&#xff1a; #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文件及基本信息 alias llls -al …