当前位置: 首页 > news >正文

力扣100热题:两、三、四数之和,哈希+数组+双指针+排序

目录

一、两数之和

二、两数之和 II - 输入有序数组

三、两数之和 III - 数据结构设计

四、两数之和 IV - 输入 BST(二叉搜索树)

五、三数之和

六、四数之和


一、两数之和

题目:1. 两数之和

参考力扣题解:. - 力扣(LeetCode)

官方两种解法:第一种是暴力枚举,第二种是哈希表。这两种解法都比较简单,实现起来也不复杂。

这里我自己使用golang的对象方式,写了一个,供参考

type twoSumData struct {nums      []inttarget    inthashTable map[int]int
}func (t *twoSumData) twoSumBase() []int {n := len(t.nums)if n <= 1 {return nil}for i := 0; i < n; i++ {for j := i + 1; j < n; j++ {if t.nums[i]+t.nums[j] == t.target {return []int{i, j}}}}return nil
}func (t *twoSumData) twoSumHashTable() []int {n := len(t.nums)if n <= 1 {return nil}for i := 0; i < n; i++ {if j, ok := t.hashTable[t.target-t.nums[i]]; ok {return []int{i, j}}t.hashTable[t.nums[i]] = i}return nil
}func twoSum(nums []int, target int) []int {data := &twoSumData{nums:      nums,target:    target,hashTable: make(map[int]int),}return data.twoSumHashTable()
}

二、两数之和 II - 输入有序数组

题目:167. 两数之和 II - 输入有序数组

还是基于前面的结构体,使用双指针,从两侧往中间,找到符合条件的结果。

func (t *twoSumData) twoSumForSortNums() []int {nums := t.numsn := len(nums)left, right := 0, n-1for left < right {sum := nums[left] + nums[right]if sum == t.target {return []int{left + 1, right + 1}} else if sum < t.target {left++} else {right--}}return nil
}func twoSum(nums []int, target int) []int {data := &twoSumData{nums:      nums,target:    target,hashTable: make(map[int]int),}return data.twoSumForSortNums()
}

三、两数之和 III - 数据结构设计

题目:170. 两数之和 III - 数据结构设计

使用双指针,查询

type TwoSum struct {nums   []inttarget int
}func Constructor() TwoSum {return TwoSum{nums:   make([]int, 0),target: 0,}
}func (this *TwoSum) Add(number int) {this.nums = append(this.nums, number)
}func (this *TwoSum) Find(value int) bool {sort.Ints(this.nums)left, right := 0, len(this.nums)-1for left < right {sum := this.nums[left] + this.nums[right]if sum == value {return true} else if sum < value {left++} else {right--}}return false
}

四、两数之和 IV - 输入 BST(二叉搜索树)

题目:653. 两数之和 IV - 输入二叉搜索树

这个题目,实际上就是在前两题的基础上,将输入修改为二叉搜索树。

题目的解法有个比较简单的方法,我们将二叉搜索树给换成数组,然后调用一、二题的函数即可。

比较复杂的方法,就是利用二叉搜索树的特点,二叉搜索树必然满足root.left.val < root.val < root.right.val

可以参考下官方题解:两数之和 IV - 输入 BST - 力扣官方题解

五、三数之和

题目:15. 三数之和

参考官方题解,使用排序+双指针

这里也使用golang的对象,完成处理

type threeSumData struct {nums   []intn      inttarget intres    [][]intfirst  intsecond intthird  int
}func (t *threeSumData) threeSumWithFixC(target int) {// b取值得到了,取c的值,b在c的左侧,c肯定大于b的,c从后面往前去,因为排序了,所以正常情况,b+c>= targetfor t.second < t.third {if t.nums[t.second]+t.nums[t.third] <= target {break}t.third--}
}// 固定A值,取B+C = target
func (t *threeSumData) threeSumWithFixB(target int) {t.third = t.n - 1for second := t.first + 1; second < t.n; second++ {// 取一个b的值,去掉重复的if second > t.first+1 && t.nums[second] == t.nums[second-1] {continue}t.second = second// fmt.Printf("second %v\n", second)t.threeSumWithFixC(target)// 如果指针重合,随着 b 后续的增加// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环if t.second == t.third {return}if t.nums[t.second]+t.nums[t.third] == target {t.res = append(t.res, []int{t.nums[t.first], t.nums[t.second], t.nums[t.third]})}}
}func (t *threeSumData) threeSumWithFixA() {// 3 <= nums.length <= 3000// -10^5 <= nums[i] <= 10^5if t.n <= 2 {return}// 数组排序sort.Ints(t.nums)// 取a值,for first := 0; first < t.n; first++ {// 取一个a值,如果当前值与上一个值一样,则跳过if first > 0 && t.nums[first] == t.nums[first-1] {continue}// 已经取了a值,按照题目,a + b + c = target,那么剩余 b + c = target - at.first = firstremain := t.target - t.nums[first]// fmt.Printf("first %v\n", first)// a取值固定了,取b值,b在a值的后面t.threeSumWithFixB(remain)}
}func threeSum(nums []int) [][]int {data := &threeSumData{nums:   nums,n:      len(nums),target: 0,res:    make([][]int, 0),first:  0,second: 0,third:  0,}data.threeSumWithFixA()return data.res
}

六、四数之和

题目:18. 四数之和

type fourSumData struct {nums                         []intn, target                    intres                          [][]intfirst, second, third, fourth int
}func (t *fourSumData) fourSumWithFixC() {nums := t.numsn := t.n// 双指针for left, right := t.second+1, n-1; left < right; {if sum := nums[t.first] + nums[t.second] + nums[left] + nums[right]; sum == t.target {t.res = append(t.res, []int{nums[t.first], nums[t.second], nums[left], nums[right]})for left++; left < right && nums[left] == nums[left-1]; left++ {}for right--; left < right && nums[right] == nums[right+1]; right-- {}} else if sum < t.target {left++} else {right--}}
}func (t *fourSumData) fourSumWithFixB() {nums := t.numsn := t.nfor second := t.first + 1; second < n-2; second++ {// 连续的四个值,和大于target时,则四元组肯定不满足条件if nums[t.first]+nums[second]+nums[second+1]+nums[second+2] > t.target {return}// a、b、c 和 d 互不相同,如果相同,或者 A+B+最大的两个值,不满足条件,则以当前值为a值,不会再有满足条件的四元组if second > t.first+1 && nums[second] == nums[second-1] || nums[t.first]+nums[second]+nums[n-2]+nums[n-1] < t.target {continue}t.second = secondt.fourSumWithFixC()}
}func (t *fourSumData) fourSumWithFixA() {nums := t.numssort.Ints(t.nums)n := t.nfor first := 0; first < n-3; first++ {// 连续的四个值,和大于target时,则四元组肯定不满足条件if nums[first]+nums[first+1]+nums[first+2]+nums[first+3] > t.target {return}// a、b、c 和 d 互不相同,如果相同,或者A+最大的三个值,不满足条件,则以当前值为a值,不会再有满足条件的四元组if first > 0 && nums[first] == nums[first-1] || nums[first]+nums[n-3]+nums[n-2]+nums[n-1] < t.target {continue}t.first = firstt.fourSumWithFixB()}return
}func fourSum(nums []int, target int) [][]int {data := &fourSumData{nums:   nums,n:      len(nums),target: target,res:    make([][]int, 0),}data.fourSumWithFixA()return data.res
}

相关文章:

力扣100热题:两、三、四数之和,哈希+数组+双指针+排序

目录 一、两数之和 二、两数之和 II - 输入有序数组 三、两数之和 III - 数据结构设计 四、两数之和 IV - 输入 BST&#xff08;二叉搜索树&#xff09; 五、三数之和 六、四数之和 一、两数之和 题目&#xff1a;1. 两数之和 参考力扣题解&#xff1a;. - 力扣&#x…...

国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney

很多小伙都在使用ChatGPT&#xff0c;但是想充值ChatGPTPLUS缺需要国外的visa卡&#xff0c;拿自己的银联卡&#xff0c;尝试了好多次还是不行&#xff0c;其实用一张国外的visa卡几分钟就可以升级好 办理国外visa卡&#xff0c;点击获取 国外的visa卡&#xff0c;具体要看你…...

【Web】记录[长城杯 2022 高校组]b4bycoffee题目复现

目录 前言 环境准备 简单分析 EXP 前言 本地jar包运行打通了&#xff0c;远程500&#xff0c;nss靶机有问题&#xff0c;换了bugku就可( 主要记录下做题过程&#xff0c;纯菜狗&#xff0c;小白文 环境准备 这次附件给的jar包是可执行jar&#xff0c;不是可依赖jar&…...

C++ 多路音频pcm混音算法

1、均值化混音算法 不适合商用&#xff0c;声音的损失比较大&#xff0c;不建议用&#xff0c;建议用第二种声音混音 short remix(short pcm1,short pcm2){ int value pcm1 pcm2; return (short)(value/2) } 2、归一化混音算法 输入数据为48Khz-2-16bit音频数据 方法&#…...

Golang 泛型定义类型的时候前面 ~ 代表什么意思

先看代码&#xff0c;定义一个简单的泛型 c1 里面一个 int &#xff0c;定义一个函数goods 下面 main函数进行调用, 如果直接传int 类型是不会报错的,但是如果传自定义类型的b就会报错。 type c1 interface {int }func goods[T c1](a T) {fmt.Println(a) }type myint intfunc …...

泽众云真机-机型支持ADB调试功能即将上线

最近云真机平台在线客服&#xff0c;收到很多咨询关于ADB调试功能&#xff0c;什么时候能更新&#xff1f;据小编所知&#xff0c;正在升级之中&#xff0c;有一块专门为了解决ADB调试功能提前准备&#xff0c;升级网络硬件设备&#xff0c;目前平台的功能已开发完成&#xff0…...

基于springboot的购物商城管理系统

1.项目简介 1.1 用户简介 用户主要分为管理员和用户端&#xff1a; 管理员&#xff1a; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有登录后进行首页轮播图的配置管理、商品的配置、新品家具商城的配置管理、、家具商城分类管理配置、家具商城详情商品管理、用户…...

uni-app开发特点和开发流程

uni-app是一个基于Vue.js框架的跨平台应用开发框架&#xff0c;通过一套代码可以同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。它采用了基于流布局的页面渲染机制&#xff0c;可以自动适配不同平台的屏幕尺寸和分辨率。uniapp官网&#xff1a;https://uniapp.dclo…...

Sentinel篇:线程隔离和熔断降级

书接上回&#xff1a;微服务&#xff1a;Sentinel篇 3. 隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离…...

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…...

【Java IO流】缓冲流和对象流的解析和应用实例

目录 前言 一、缓冲流 四种方式拷贝文件的用时对比 二、对象流 1. 使用对象流写入对象到本地文件 2. 使用对象流读取对象数据 总结 前言 【File文件管理及IO流&#xff08;基本流&#xff09;】http://t.csdnimg.cn/uG5Ff 该篇博客中&#xff0c;介绍了学习高级流需要的…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Select)

提供下拉选择菜单&#xff0c;可以让用户在多个选项之间选择。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Select(options: Array<SelectOption>) 参数&#xff1a;…...

mysql将一个表另存为新表,同时复制索引、约束、主键等信息

使用 SHOW CREATE TABLE 语句获取原表的创建语句&#xff1a; SHOW CREATE TABLE 原表名;将 原表名 替换为要复制的原始表的名称。 此语句将返回一个包含原表完整创建语句的结果集。创建语句包括表的结构、列定义、索引、约束、主键等所有信息。 复制结果集中的创建语句&…...

基于springboot+vue的房屋交易平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

17个工作必备的Python自动化代码分享(上篇)

引言 Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化的世界&#xff0c;探索17个可以简化工作并节省时间精力的Python脚本。 目录&#xff08;上篇&#xff0…...

python-0008-修改django数据库为mysql

操作系统 centos7 执行 在虚拟环境中执行&#xff1a; pip3 install mysqlclient2.2.4 -i https://mirrors.aliyun.com/pypi/simple无法安装问题 如果安装mysqlclient时提示找不到对应的版本&#xff0c;或者编译失败&#xff0c;请退出虚拟环境&#xff0c;执行以下操作&…...

oracle用户密码过期

很久不用的项目遇到报错 2024-03-14 11:15:01.806 [Druid-ConnectionPool-Create-110651474] ERROR com.alibaba.druid.pool.DruidDataSource 2879 - create connection SQLException, url: jdbc:oracle:thin://192.168.0.54:1521/orcl, errorCode 28001, state 99999 java.sq…...

安全地使用v-html

vue2 1、 使用插件DOMPurify DOMPurify是一个开源的基于DOM的快速XSS净化工具。输入HTML元素,然后通过DOM解析递归元素节点,进行净化,输出安全的HTML <div v-html"sanitizedContent"></div>import DOMPurify from dompurify; data () {return {htmlCont…...

MongoDB从0到1:高效数据使用方法

MongoDB&#xff0c;作为一种流行的NoSQL数据库。从基础的文档存储到复杂的聚合查询&#xff0c;从索引优化到数据安全都有其独特之处。文末附MongoDB常用命令大全。 目录 1. 引言 MongoDB简介 MongoDB的优势和应用场景 2. 基础篇 安装和配置MongoDB MongoDB基本概念 使…...

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意&#xff1a;(自增)和--(自减)在go语言中是单独的语句&#xff0c;并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...