返回顶部
首页 > 资讯 > 前端开发 > node.js >怎么实现经典的求和问题
  • 294
分享到

怎么实现经典的求和问题

2024-04-02 19:04:59 294人浏览 独家记忆
摘要

本篇内容介绍了“怎么实现经典的求和问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两数之和题目描述:给定

本篇内容介绍了“怎么实现经典的求和问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

两数之和

题目描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

题目很容易理解,即让查看数组中有没有两个数的和为目标数,如果有的话则返回两数下标,在这为大家提供两种解法双指针(暴力)法,和哈希表法,大家可以看一下。

哈希表法

解析

哈希表的做法很容易理解,我们只需通过一次循环即可,假如我们的 target 值为 9,当前指针指向的值为 2 ,我们只需从哈希表中查找是否含有 7,因为9  - 2 =7 。如果含有 7 我们直接返回即可,如果不含有则将当前的2存入哈希表中,指针移动,指向下一元素。注:key 为元素值,value  为元素索引

动图解析:

怎么实现经典的求和问题

是不是很容易理解,下面我们来看一下题目代码。

题目代码:

怎么实现经典的求和问题

双指针(暴力)法

解析

双指针(L,R)法的思路很简单,L指针用来指向第一个值,R指针用来从L指针的后面查找数组中是否含有和L指针指向值的和为目标值的数。见下图

例:绿指针指向的值为3,蓝指针需要在绿指针的后面遍历查找是否含有 target - 3 的元素即 5 - 3 = 2,若含有返回即可。

怎么实现经典的求和问题

题目代码

怎么实现经典的求和问题

三数之和

题目描述:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0  ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2] ]

这个题目算是对刚才题目的升级,刚才题目我们是只需返回一个例子即可,但是这个题目是让我们返回所有情况,这个题目我们需要返回三个数相加为 0  的所有情况,但是我们需要去掉重复的三元组(算是该题的核心),所以这个题目还是挺有趣的,大家记得打卡呀。

哈希表法

解析

我们这个题目的哈希表解法是很容易理解的,我们首先将数组排序,排序之后我们将排序过的元素存入哈希表中,然后我们首先通过两层遍历,确定好前两个数字,那么我们只需要哈希表是否存在符合情况的第三个数字即可,跟暴力解法的思路类似,很容易理解,但是这里我们需要注意的情况就是,例如我们的例子为[-2  , 1 , 1],如果我们完全按照以上思路来的话,则会出现两个解,[-2 , 1 , 1]和[1 , 1, -2]。具体原因为,确定 -2,1之后发现 1  在哈希表中,存入。确定 1 ,1 之后发现 -2 在哈希表中,存入。所以我们需要加入一个约束避免这种情况,那就是我们第三个数的索引大于第二个数时才存入。

怎么实现经典的求和问题

上面这种情况时是不可以存入的,因为我们虽然在哈希表中找到了符合要求的值,但是 -2 的索引为 0 小于 2 所以不可以存入。

题目代码

怎么实现经典的求和问题

多指针

解析:

如果我们将上个题目的指针解法称做是双指针的话,那么这个题目用到的方法就是三指针,因为我们是三数之和嘛,一个指针对应一个数,下面我们看一下具体思路,其实原理很简单,我们先将数组排序,直接  Arrays.sort() 解决,排序之后处理起来就很容易了。下面我们来看下三个指针的初始位置。

怎么实现经典的求和问题

初始情况见上图,我们看当前情况,三数之和为 -3 ,很显然不是 0 ,那么我们应该怎么做呢?

我们设想一下,我们当前的三数之和为 -3 < 0  那么我们如果移动橙色指针的话则会让我们的三数之和变的更小,因为我们的数组是有序的,所以我们移动橙色指针(蓝色不动)时和会变小,如果移动蓝色指针(橙色不动)的话,三数之和则会变大,所以这种情况则需要向右移动我们的蓝色指针,找到三数之和等于  0 的情况进行保存,如果三数之和大于 0 的话,则需要移动橙色指针,途中有三数之和为 0  的情况则保存。直至蓝橙两指针相遇跳出该次循环,然后我们的绿指针右移一步,继续执行上诉步骤。但是这里我们需要注意的一个细节就是,我们需要去除相同三元组的情况,我们看下面的例子。

怎么实现经典的求和问题

这里我们发现 0 - 1 + 1 = 0,当前情况是符合的,所以我们需要存入该三元组,存入后,蓝色指针向后移动一步,橙色指针向前移动一步,我们发现仍为 0  -1 + 1 = 0 仍然符合,但是如果继续存入该三元组的话则不符合题意,所以我们需要去重。这里可以借助HashSet但是效率太差,不推荐。这里我们可以使用  while 循环将蓝色指针移动到不和刚才相同的位置,也就是直接移动到元素 0  上,橙色指针同样也是。则是下面这种情况,这样我们就实现了去重,然后继续判断当前三数之和是否为 0 。

怎么实现经典的求和问题

动图解析:

怎么实现经典的求和问题

题目代码:

怎么实现经典的求和问题

四数之和

题目描述

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c  + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

我们已经完成了两数之和和三数之和,这个题目应该就手到擒来了,因为我们已经知道这类题目的解题框架,两数之和呢,我们就先固定第一个数  ,然后移动指针去找第二个符合的,三数之和,固定一个数,双指针去找符合情况的其他两位数,那么我们四数之和,也可以先固定两个数,然后利用双指针去找另外两位数。所以我们来搞定他吧。

多指针:

解析:

三数之和是,我们首先确定一个数,然后利用双指针去找另外的两个数,我们在这个题目里面的解题思路是需要首先确定两个数然后利用双指针去找另外两个数,和三数之和思路基本一致很容易理解。我们具体思路可以参考下图。

这里需要注意的是,我们的 target 不再和三数之和一样为 0 ,target  是不固定的,所以解题思路不可以完全照搬上面的题目。另外这里也需要考虑去重的情况,思路和上题一致。

怎么实现经典的求和问题

上图则为我们查找到一个符合条件的四元组的情况,查找成功之后,下一步移动蓝色指针,重新定义绿蓝指针,继续执行上面步骤。

怎么实现经典的求和问题

动图解析:

怎么实现经典的求和问题

题目代码:

怎么实现经典的求和问题

“怎么实现经典的求和问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么实现经典的求和问题

本文链接: https://lsjlt.com/news/84271.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么实现经典的求和问题
    本篇内容介绍了“怎么实现经典的求和问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两数之和题目描述:给定...
    99+
    2024-04-02
  • Redis的八个经典问题是什么
    本篇内容介绍了“Redis的八个经典问题是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么使用...
    99+
    2024-04-02
  • 经典java面试题_实习生必问!
    经典java面试题_实习生必问!第一,谈谈final, finally, finalize的区别。final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstr...
    99+
    2020-03-21
    java面试题 java
  • 浅谈Angular的12个经典问题
    目录1. 请解释Angular 2应用程序的生命周期hooks是什么?2. 使用Angular 2,和使用Angular 1相比,有什么优势?3. Angular 2中的路由工作原理...
    99+
    2024-04-02
  • LeetCode经典算法题解,Java实现版!
    在程序员的职业生涯中,算法是一个非常重要的领域。而LeetCode作为一个非常流行的在线编程平台,它提供了大量的算法题目,帮助程序员们提高算法能力。在这篇文章中,我们将为你介绍一些经典的算法题目,并提供Java实现版的解题思路和代码。 1...
    99+
    2023-09-01
    二维码 load leetcode
  • Python实现经典题:百元买百鸡
    百元买百鸡问题。“百元买百鸡”是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?用现代 语言描述为:用100元钱买来100只鸡,公鸡5元钱一只,母鸡3元钱一...
    99+
    2023-10-22
    python 算法 开发语言
  • JavaScript错误的经典问题有哪些
    这篇文章主要介绍“JavaScript错误的经典问题有哪些”,在日常操作中,相信很多人在JavaScript错误的经典问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript错误的经典问题...
    99+
    2023-06-27
  • HTML5怎么实现经典坦克大战
    这篇文章主要介绍“HTML5怎么实现经典坦克大战”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“HTML5怎么实现经典坦克大战”文章能帮助大家解决问题。 代码如下:...
    99+
    2024-04-02
  • C语言中递归的实际应用与经典问题
    目录一、什么是递归二、递归模板三、递归的实际应用1.阶乘递归2.斐波那契数列四、递归的经典问题汉诺塔问题青蛙跳台阶总结一、什么是递归 递归简单的来说就是在函数中调用自己 它通常把一...
    99+
    2024-04-02
  • Java怎么实现经典游戏泡泡堂
    这篇文章主要介绍“Java怎么实现经典游戏泡泡堂”,在日常操作中,相信很多人在Java怎么实现经典游戏泡泡堂问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么实现经典游戏泡泡堂”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • win10主题怎么改成经典模式
    本文小编为大家详细介绍“win10主题怎么改成经典模式”,内容详细,步骤清晰,细节处理妥当,希望这篇“win10主题怎么改成经典模式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win10主题改成经典模式的方法第...
    99+
    2023-06-30
  • 怎么用matlab代码实现经济调度问题
    本篇内容主要讲解“怎么用matlab代码实现经济调度问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用matlab代码实现经济调度问题”吧!1 内容介绍为...
    99+
    2024-04-02
  • Python怎么实现十大经典排序算法
    这篇“Python怎么实现十大经典排序算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么实现十大经典排序算法...
    99+
    2023-06-29
  • JS+HTML怎么实现经典吃豆人游戏
    这篇文章主要介绍“JS+HTML怎么实现经典吃豆人游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS+HTML怎么实现经典吃豆人游戏”文章能帮助大家解决问题。项目结构因需要四个文件即可实现,in...
    99+
    2023-06-30
  • C语言堆排序经典算法TopK问题怎么解决
    本文小编为大家详细介绍“C语言堆排序经典算法TopK问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言堆排序经典算法TopK问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述:从a...
    99+
    2023-07-05
  • C++ 函数的递归实现:递归的经典谜题示例?
    递归是一种编程技术,它允许函数调用自身以解决复杂问题,通过分解成子问题来实现。实战案例中,汉诺塔谜题的递归实现:1. 当只有一个圆盘时,直接移动到目标塔。2. 将小圆盘移动到辅助塔。3....
    99+
    2024-04-22
    c++ 递归
  • 怎么用C语言实现扫雷经典游戏
    本篇内容介绍了“怎么用C语言实现扫雷经典游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言实现扫雷游戏,供大家参考,具体内容如下实现扫...
    99+
    2023-06-20
  • 怎么用JAVA实现经典游戏坦克大战
    这篇文章主要介绍“怎么用JAVA实现经典游戏坦克大战”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用JAVA实现经典游戏坦克大战”文章能帮助大家解决问题。主要设计要有难度关卡:第一关,第二关,第...
    99+
    2023-06-29
  • 基于Python+Pygame怎么实现经典赛车游戏
    这篇文章主要介绍“基于Python+Pygame怎么实现经典赛车游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python+Pygame怎么实现经典赛车游戏”文章能帮助大家解决问题。一、环境...
    99+
    2023-06-30
  • C#实现经典飞行棋游戏的脚本怎么写
    今天小编给大家分享一下C#实现经典飞行棋游戏的脚本怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果展示主函数&nbs...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作