算法讨论题 —— Java实现两数之和

2023-09-21 03:36:53

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次。

2023-09-20_14-03-08

示例

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

解答

这个题目的原题是在:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 网站上能找到。

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

 

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
 

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
 

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

完整的题目要求如上。

应该对所有人第一次想到的就是使用 2 个 For 循环吧。

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    log.debug("{}", new int[]{i, j});
                }
            }
        }

然后从 2 个 for 循环中获得下标列表,最后 break 循环就可以了。

进阶问题

如何让我们只使用 1 个 for 循环的情况下解决这个问题。

这个时候我们就需要使用 HashMap 了。

首先,我们把数据放入到 HashMap 中。

然后取第一个元素,当取得第一个元素后,再用和减去第一个元素,这个得到的值为另外一个元素。

然后拿着这个元素到 HasMap 中去找,如果找到了就返回,如果没找到就继续去获得下一个元素。

然后再拿和去减去获得的第二个元素后再到 Map 中去找。

        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement) && map.get(complement) != i) {
                log.debug("{}", new int[]{i, map.get(complement)});
            }
        }

用一个 Map 解决

还有一个更高的效率,就是在循环一次,然后用 Map 解决。

在上面的解决方案中,我们在对 HashMap 遍历了 2 次,第一次是构建 Map,第二次是从 Map 中查找。

能不能我们在构建的时候就完成操作。

答案是肯定的。

于是,我们就有了下面的代码:

        Map<Integer, Integer> map2 = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {

            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                log.debug("{}", new int[]{map2.get(complement), i});
            }
            map2.put(nums[i], i);
        }

上面的代码在 HashMap 构建的时候就进行判断,把和减掉当前的值,如果我们的 Map 中能够找到这个值,我们就返回。

如果不能找到就添加到 Map 中。

总结

如果不考虑效率的方法,第一个方法就可以解决问题了。

这个没有什么难度。

如果需要考虑效率的话,重构数据结构,通常是比较有效的方法,Java 中用得比较多的是 Map,因为 Map 通常能够存储更多的信息,而且遍历效率高。

我们对一些问题,如果算法不太好弄的话,通常考虑的是能不能给它们换个数据结构,比如说 List ,Map 呀这种的。

个人感觉这个题目在算法中是属于比较简单的题目,但是不同的解法可能会比较多。

整体感觉还是不错的,没有像一些算法题目,一上来就给你一个下马威,你完全都没有想明白数据结构应该怎么存。然后后面的逻辑就会越来越混乱。

算法讨论题 —— Java实现两数之和 - 求职路上 - iSharkFly

更多推荐

Golang Gorm 一对多 关联模式 Association + Find 查询关联

查找关联//User拥有并属于多种language,`user_languages`是连接表typeUserstruct{gorm.ModelLanguages[]Language`gorm:"many2many:user_languages;"`}typeLanguagestruct{gorm.ModelNamest

I Pa?sWorD

2023icpc网络赛第一场I题意:题目给出只包含大小写字母,数字以及'?'的字符串,对于每一个小写字母,这一位字符既有可能是该小写字母,也有可能是该小写字母的对应大写字母,也就是该位的字符有两种可能,对于问号,可能是所有大写字母或者所有小写字母,或者所有单数字,则共有62种情况,而对于大写字母和数字位则都是确定的只有

Hive【非交互式使用、三种参数配置方式】

前言今天开始学习Hive,因为毕竟但凡做个项目基本就避不开用Hive,争取这学期结束前做个小点的项目。第一篇博客内容还是比较少的,环境的搭建配置太琐碎没有写。Hive常用使用技巧交互式使用就是我们正常的进入hive命令行下的使用模式。非交互式使用所谓非交互式,也就是不需要进入hive命令行,直接在我们linuxShel

STViT-R 代码阅读记录

目录一、SwinTransformer1、原理2、代码二、STViT-R1、中心思想2、代码与原文本次不做具体的训练。只是看代码。所以只需搭建它的网络,执行一次前向传播即可。一、SwinTransformer1、原理主要思想,将token按区域划分成窗口,只需每个窗口内的token单独进行self-attention。

Mybatis sql参数自动填充

问题描述在日常开发中,经常会遇到Mybatissql语句的操作问题,由于Mybatis实现sql的动态拼接,开发过程中,为了验证sql是否书写正确,通常需要获取的控制台打印的sql语句来检查是否拼接正确。如下图所示:那么为了验证sql的正确性,需要复制控制台sql以及sql参数,手工进行拼接后在数据库连接工具(比如na

python学习--字符串的常用操作

字符串查询操作功能方法名称作用查询方法index()查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出valueError查询方法rindex()查找子串sunstr最后一次出现的位置,如果查找的子串不存在时,则抛出valueError查询方法find()查找子串sunstr第一次出现的位置,如果查找

DGUS 功能升级:任意页面控件均可灵活叠加

针对进一步提升DGUS平台控件组合灵活度的市场需求,迪文在DGUS平台中新增设了“页面叠加开关”接口,可用于实现全局动态报警提示等功能。使用该功能,用户可以将任意页面的控件叠加到全部剩余页面上,叠加页面的控件默认为最高优先级,叠加页面上的控件处于被叠加页面的最上层(包含叠加页面的全部显示控件和触摸控件)。触摸控件的优先

spring security教程(一)--认证

零.简介【1】简介【2】登录校验流程【3】原理(入门的时候先了解一下就好)一.思路分析二.建表确保你已经建立好一张用户表,并且引入springboot,mybatis,mp,slf4j等基础依赖。即使你有多个角色你也可以将他们的相同信息(如用户名密码登都提取到一张表中)。并根据表编写对应实体类和mapper。上面是我建

【SpringMVC】JSON数据传输与异常处理的使用

文章目录一、Jackson1.1Jackson是什么1.2常用注解1.3实例1.3.1导入依赖1.3.2配置spring-mvc.xml1.3.3JsonController.java二、SpringMVC异常处理机制2.1使用原因2.2SpringMVC异常处理2.2.1异常处理机制流程图2.2.2异常处理的三种方式

基于SpringBoot的超市管理系统

基于SpringBoot+Vue的超市管理系统、超市进销存系统,前后端分离开发语言:Java数据库:MySQL技术:SpringBoot、Vue、MybaitsPlus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven【主要功能】角色:管理员、员工管理员:个人信息管理、员工管理、客户管理、供

数据结构之时间复杂度&&空间复杂度的计算

数据结构:计算机如何存储数据的问题。DS关心的是如何高效的进行数据的读写。算法:在特定的数据集上(不关心怎么进行具体数据的读写),如何利用数据完成特定的功能。算法本质上就是一系列运算的先后集合。那么,如何评价一个算法的好坏?从两种维度进行:时间效率与空间效率时间复杂度:主要衡量一个算法的运行速度(不是实际计算机的运行速

热文推荐