力扣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
}

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

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

相关文章

数据库——书籍+内容0.1版本

背景&#xff1a;将一本书&#xff0c;存入我们的数据库中&#xff0c;并可以查出来 采用&#xff1a;第三范式&#xff08;3NF&#xff09;设计模式 设计数据库模板 第一范式&#xff08;1NF&#xff09;&#xff1a;确保表的每一列都是不可分割的原子数据项。 第二范式&…

软件测试-------Web(性能测试 / 界面测试 / 兼容性测试 / 安全性测试)

Web&#xff08;性能测试 / 界面测试 / 兼容性测试 / 安全性测试&#xff09; 一、Web性能测试&#xff1a;&#xff08;压力测试、负载测试、连接速度测试&#xff09;1、压力测试&#xff1a;      并发测试 &#xff08;如500人同时登录邮箱&#xff09; 2、负载测试…

上位机图像处理和嵌入式模块部署(qmacvisual结束判断)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qmacvisual软件当中&#xff0c;这个判断结束很容易会给大家造成误会&#xff0c;因为它会让大家认为&#xff0c;这和是判断语句一起使用的。但…

PaaS家族的中坚力量——aPaaS

aPaaS是什么&#xff1f;接下来无雀科技为大家介绍一下。aPaaS作为一种先进的云服务模式&#xff0c;为用户提供了无缝的应用程序和部署环境。以SDK、API以及构建的组件为基础&#xff0c;通过零代码或低代码的方式大大地降低了软件开发的技术门槛&#xff0c;使得业务人员不需…

智慧能源管理系统在大学校园的应用-安科瑞 蒋静

1 背景 为贯彻落实《中共中央国务院关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》和《国务院关于印发2030年前碳达峰行动方案的通知》要求&#xff0c;把绿色低碳发展纳入国民教育体系。 2 传统模式的痛点 传统项目模式下的系统方案缺乏整体的能源监测和管控…

AI在编程中的作用:提升效率、改善代码质量与未来发展趋势

引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到我们生活的方方面面&#xff0c;而在编程领域&#xff0c;AI的应用正带来革命性的变革。从代码生成到错误检测&#xff0c;再到自动化测试&#xff0c;AI的身影无处不在。本文将深入探讨AI…

前端 网络相关事件 交互

前端 网络相关事件 交互 设置断线、上线提示 这里可以做断线重连 使用online表示在线事件使用offline表示离线事件 当前是否离线 /*** * 判断是否离线* 如果是在线将值改为在线*/ window.addEventListener("offline", function (event) {onlineStatus.innerHTML…

信息系统项目管理(第四版)(高级项目管理)考试重点整理 第14章 项目沟通管理(四)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

Java面试题合集-史上最全

3月4月又到了一年一度的跳槽黄金期&#xff0c;无论几年经验&#xff0c;也无论技术能力如何&#xff0c;跳槽前都离不开面试准备&#xff0c;其中刷面试题是重中之重。 刷面试题的时候一大痛点就是太分散了&#xff0c;需要自己根据知识点一项一项的去搜&#xff0c;容易遗漏…

MySQL语法分类 DQL(5)分组查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 …

git:码云仓库提交以及Spring项目创建

git&#xff1a;码云仓库提交 1 前言 码云访问稳定性优于github&#xff0c;首先准备好码云的账户&#xff1a; 官网下载GIT&#xff0c;打开git bash&#xff1a; 查看当前用户的所有GIT仓库&#xff0c;需要查看全局的配置信息&#xff0c;使用如下命令&#xff1a; git …

力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述 2.知识点 注1&#xff1a;向下取整是将一个数值向下舍入到最接近的整数&#xff0c;但不超过这个数值的整数。具体规则如下&#xff1a; 对于正数&#xff0c;向下取整后得到的整数是不大于原数值的最大整数&#xff1b; 对于负数&#xff0c;向下取整后得到的整数…

深入浅出 Spring:核心概念和基本用法详解

个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1b;《Java》 一、引言 在 Java 企业级应用开发中&#xff0c;Spring 框架已经成为了事实上的标准。它提供了一种轻量级的解决方案&#xff0c;使得开发者能够更轻松地构建灵活、可扩展的应用程序。在本文中&#xff0c…

基于英特尔® Gaudi® 2 AI 加速器的文本生成流水线

随着生成式人工智能 (Generative AI&#xff0c;GenAI) 革命的全面推进&#xff0c;使用 Llama 2 等开源 transformer 模型生成文本已成为新风尚。人工智能爱好者及开发人员正在寻求利用此类模型的生成能力来赋能不同的场景及应用。本文展示了如何基于 Optimum Habana 以及我们…

基于springboot+vue实现艺术水平考级报名系统【项目源码+论文说明】计算机毕业设计

基于springbootvue实现艺术水平考级报名系统演示 摘要 本次毕业设计基于SpringBoot框架开发了一款艺术水平考级报名管理系统。该系统为考生提供了线上报名、准考证管理等核心功能&#xff0c;并为系统管理员提供了在线发布考试信息、对报名考生进行审核等管理功能。通过该系统…

拥塞控制1

造成网络拥塞的原因主要有两方面。首先&#xff0c;当多条流入线路有分组到达并需要同一输出线路时&#xff0c;如果路由器没有足够的内存来存放所有这些分组&#xff0c;那么有的分组就会丢失。其次&#xff0c;路由器的慢速处理器可能难以完成必要的处理工作&#xff0c;如缓…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

ffmpeg6.0从demux_decode.c源码探索解封装流程

前言 在播放器的播放视频、音视频媒体文件的推流等实际应用中,解封装(demux)这个操作是不可避免的,也是最基础的操作。 拿播放器播放MP4来说,如果想实现播放器视频画面的播放和音频声音的播放都需要经过这个解封装的步骤。因为MP4是一种媒体文件格式,是一种封装格式,M…

快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M

QtiPlot 是一个用于数据分析和可视化的跨平台科学应用程序。由于其多语言支持&#xff0c;QtiPlot 被积极用于世界各地学术机构的教学。许多研究科学家信任 QtiPlot 来分析他们的数据并发布他们的工作结果。来自各个科学领域和行业的数千名注册用户已经选择了 QtiPlot 来帮助他…