001两数之和

news2024/11/25 6:47:00

题意

给出一个数组和一个目标值,让你在数组中找出和为目标值的两个数,并且这两个数在数组中的下标(索引)不同。

示例

输入:nums=[2,7,11,15],target=9

输出:[0,1]

解释:因为nums[0]+nums[1]==9,返回[0,1]

分析

所谓的“暴力”,在算法领域表示“穷举、极低效率的实现”。主要源于这个英文单词(Brute-Force,暴力攻击)。

两层遍历,第一层确定第一个数,第二层确定第二个数,用一个加法运算就可以完成题目的要求。

classSolution{
//定义一个方法twoSum,接收一个整数数组nums和一个目标值target
publicint[]twoSum(int[]nums,inttarget){
//外层循环遍历数组中的每个元素
for(inti=0;i<nums.length;i++){
//内层循环从当前元素的下一个开始遍历
for(intj=i+1;j<nums.length;j++){
//检查当前选中的两个数之和是否等于目标值
if(nums[i]+nums[j]==target)
//如果等于目标值,返回这两个数的索引
returnnewint[]{i,j};
}
}

//如果遍历完数组都没有找到符合条件的两个数,则抛出异常
thrownewIllegalArgumentException("没有找到");
}
}

笔试如果遇到不太会的题,就暴力。不过两次遍历的时间复杂度是 。

时间复杂度,在算法领域是一个非常重要的概念,一个衡量算法执行时间随输入数据规模增长而增长的度量。在这个特定的 “两数之和” 问题的解法中,时间复杂度是由两层嵌套循环决定。

时间复杂度实在是太不理想,效率太低,在所有 Java 提交中只能击败不到 28% 的用户。

虽然击败了 33% 的 Java 选手,但是这样的算法时间复杂度和之前相比根本没有变化。

我们反推一下。

已知 i 和 target,那么target - i就是与 i 相配对的另一个数,我们只需要判断target - i是否在 i 之前出现过,如果出现过,那么这两个数就是我们要找的数。

那么问题来了,如何判断target - i是否在 i 之前出现过呢?

我们可以用一个 HashMap 来记录数组中的每一个元素,元素的索引作为哈希表的 key,元素本身作为 value,当发现target - i在哈希表中存在时,就可以直接返回这两个数的索引了。来看题解。

class Solution {
    //定义一个方法twoSum,接收一个整数数组nums和一个目标值target
    public int[] twoSum(int[] nums, int target) {
        //定义一个HashMap用于存储数组元素以及他的索引

        HashMap<Integer,Integer> map = new HashMap<>();
        //遍历数组中的每一个元素
        for(int i = 0 ;i<nums.length;i++){
            //计算与当前元素配对的元素
            int complement = target - nums[i];
            //检查HashMap中是否已经存在配对元素
           if(map.containsKey(complement)){
               //存在,就将两元素的下标进行返回
               return new int[]{i , map.get(complement)};
           }
           //将当前元素及其索引添加到哈希表中
           map.put(nums[i] ,i);

        }
       
throw new IllegalArgumentException("没找到");

    }
}

当输入是 nums = [2,7,11,15] 和 target = 9 时,我们来模拟上述解决 “两数之和” 的整个过程:

  1. 初始化哈希表:开始时,哈希表为空。
  2. 遍历数组
  3. 第一个元素(i = 0):nums[0] = 2
  4. 计算 complement = target - nums[i] = 9 - 2 = 7。
  5. 检查哈希表中是否存在 7。目前哈希表为空,所以不存在。
  6. 将 (2, 0) 加入哈希表(值为 2,索引为 0)。
  7. 第二个元素(i = 1):nums[1] = 7
  8. 计算 complement = 9 - 7 = 2。
  9. 检查哈希表中是否存在 2。是的,它存在,并且索引为 0。
  10. 找到匹配的一对元素:nums[0] = 2 和 nums[1] = 7,它们的和为 9。
  11. 返回这两个元素的索引 [1, 0]。

因此,对于输入 nums = [2,7,11,15] 和 target = 9,该题解会返回 [1, 0] 作为结果,表示 nums 数组中索引为 1 和 0 的元素相加得到目标值 9。

时间复杂度:

空间复杂度:

哦吼,这次结果就不一样了,打败了 71% 的选手,效果显著。

总结

对于本题,我们用到了 Java 中的一个普通 for 循环,和一个 HashMap,这两个都是 Java 中必须掌握的知识,如果你对这两个都不熟悉,那么你的 Java 基础还是不够扎实。

建议通过下面三个链接来学习:

  1. Java for 循环
  2. 数组
  3. HashMap

力扣链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了

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

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

相关文章

Draw.io or diagrams.net 使用方法

0 Preface/Foreword 在工作中&#xff0c;经常需要用到框图&#xff0c;流程图&#xff0c;时序图&#xff0c;等等&#xff0c;draw.io可以完成以上工作。 official website:draw.io 1 Usage 1.1 VS code插件 draw.io可以扩展到VS code工具中。

PHP基础 - 数组遍历与排序

介绍 在PHP中,数组遍历和排序是常见的操作,用于对数组中的元素进行访问和排序 数组遍历 1)数值数组的遍历 使用 foreach 循环遍历数组:foreach 循环是最常用的遍历数组的方法,它可以遍历索引数组和关联数组。例如:$fruits = array("apple", "banana&q…

浪涌保护器综合选型应用方案

浪涌保护器SPD是一种用于防止电气设备和电子信息系统受到雷电或其他过电压的影响的装置。浪涌保护器的选型是一个重要的工程问题&#xff0c;因为不同的应用场景和设备要求需要不同的浪涌保护器。本文将介绍浪涌保护器的行业分类选型方案&#xff0c;浪涌保护器选型的作用和意义…

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法…

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用&#xff0c;它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能&#xff0c;提供详实的示例代码&#xff0c;帮助大家更好地使用和定制Django后台管理界面。 安装与…

科学小论文

赵州桥&#xff0c;是一座右拱桥&#xff0c;它座落于河北省石家庄市赵县城南液河之上。 赵州桥因赵县古称赵州而得名&#xff0c;当地人称之为大石桥&#xff0c;以区别于城西门外的永通桥&#xff0c;也称小石桥。 赵州桥始建于隋代&#xff0c;由匠师李春设计建造&#xff…

Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;Java关键字 —— super 详细解释&#xff01;一看就懂 有代码实例运行&#xff01; 目录 前言 static static修饰类中的成员变量 static修…

【SpringSecurity】-- 认证、授权

文章目录 SpringSecurity简介快速入门1.准备工作1.2引入SpringSecurity 认证1.登录校验流程2.原理2.1SpringSecurity完整流程2.2认证流程详解 3.解决问题3.1思路分析3.2准备工作3.3.实现3.3.1数据库校验用户3.3.2密码加密存储3.3.3登录接口3.3.4认证过滤器3.3.5退出登录 授权1.…

Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

指针(笔记1)

一、内存和地址 内存及其管理方法: 1.计算机主存储器由一个一个存储单元组成&#xff0c;微型计算机以字节作为存储单元 2.内存区的每一个字节有一个唯一的编号&#xff0c;这就是“地址”&#xff0c;它相当于教学楼中的教室号 3.内存地址&#xff0c;是一个无符号整数(un…

Modelscope Agent初体验与思考

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。 例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世…

树链剖分(知识点整理)

思路来源 https://www.tuicool.com/articles/ee2QZf6 spoj375(树链剖分)-CSDN博客 概念 直接扒过来了&#xff0c;懒得写了…… 显然轻子树比重子树小&#xff0c;就少于父亲的一半&#xff0c; 然后性质2的证明就是基于此的…… 因为重链是间断的&#xff0c;所以两条重链…

从零开始搭建企业管理系统(四):集成 Knife4j

集成 Knife4j 前言Knife4j是什么集成 Knife4j引入 pom 依赖添加基础配置启动程序测试完善文档信息编写配置类修改 UserController修改 UserEntity修改 BaseEntity 文档效果图swagger 界面knife4j 界面 前言 前面一小节我们使用postman来进行接口的调试&#xff0c;如果接口一多…

服务器GPU占用,kill -9 PID 用不了,解决办法

PID&#xff08;progress ID 进程ID&#xff09; 上图为占用情况&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法&#xff0c;一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…

【LeetCode刷题-树】-- 99.恢复二叉树

99.恢复二叉树 方法&#xff1a; 对二叉搜索树进行中序遍历得到值序列不满足的位置找到对应被错误交换的节点记为x和y交换x和y两个节点 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* Tre…

2024 年顶级的 Android 系统修复软件与方法

您是否正在寻找可以修复 PC 上 Android 操作系统的工具&#xff1f;这是我们精选的最好的 Android 系统修复软件&#xff01; Android 是世界著名的智能手机操作系统。全世界有数百万人使用这个操作系统&#xff0c;这使得它安全可靠。然而&#xff0c;这仍然不能使它完美无缺…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-2稳定性分析Stability

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-2稳定性分析Stability 0. 序言1. 稳定的分类2. 稳定的对象3. 稳定的系统4. 系统稳定性的讨论5. 补充内容——Transfer Function(传递函数) - nonzero Initial Condition(非零初始…

深度学习——第4.2章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.6 矩阵 4.6 矩阵 下一章开始&#xff0c;我们就会用到矩阵。借助矩阵&#xff0c;可以用一个式子表示大量的联立方程式&#xff0c;特别方便。此外&#xff0c;使用矩阵或向量表示&#xff0c;也会更有助于我们直观理解方程式。 图4-13 标…

spring-cloud-starter-openfeign的maven引入方式引发的故障,分析其原理

一、背景 OpenFeign是一种声明式的REST客户端&#xff0c;openfeign是开发常用的对外提供服务&#xff0c;以及调用外部提供的openfeign接口的工具类&#xff0c;基于Java的HTTP客户端库&#xff0c;用于简化HTTP请求和响应的处理。OpenFeign支持多种编解码器&#xff0c;包括…

人工智能在安全领域的应用

ChatGPT 等 AI 应用在网络安全领域的应用效果明显&#xff0c;其自动编程能力、分析能力及自身集成的知识库能够帮助网络安全从业者提升工作效率&#xff0c;改进组织的网络安全计划。 &#xff08;一&#xff09;代码生成与检测能力 可用于开发漏洞挖掘工具。如目前可以利用…