算法小白刷力扣 1 - 两数之和

题目描述

原题链接:https://leetcode.cn/problems/two-sum/description/

给定一个整数数组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
  • 只会存在一个有效答案

2. 我的解法

毫无疑问,算法小白首先想到的肯定是暴力破解。什么是暴力破解?众所周知,凡是用了双层循环导致算法复杂度为 O(n^2) 的肯定不算最优解,是暴力破解,来看看我的暴力破解。

class Solution {public int[] twoSum(int[] nums, int target) {int[] result = new int[2];for(int i = 0; i < nums.length; i++) {boolean found = false;// 这里是关键,由于是从前往后挨个找,那第 i 个元素之前的元素已经找过了,就不需要再算了,因此每次从第 i + 1 个元素开始找for(int j = i + 1; j < nums.length; j++) {if(nums[i] + nums[j] == target) {result[0] = i;result[1] = j;found = true;break;}}if(found) {break;}}return result;}
}

因为题目明确说明只有一个有效答案,所以找到第一组解时就应该停止循环,所以用了一个 flag 标志,如果找到就 break,但看了官方解法,这一步纯属多余,找到直接 return 不就行了,我哭~
这里贴一下官方提供的暴力破解法以供参考:

class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (nums[i] + nums[j] == target) {return new int[]{i, j};}}}return new int[0];}
}

3. 正确解法

照例先贴代码,因为我没想到,所以没思路可说:

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();for (int i = 0; i < nums.length; ++i) {if (hashtable.containsKey(target - nums[i])) {return new int[]{hashtable.get(target - nums[i]), i};}hashtable.put(nums[i], i);}return new int[0];}
}

只有一层循环,显然时间复杂度降为了 O(n)。但没想到的是它竟然用了哈希表!我以为不能直接用现成的数据结构呢,还寻思有啥特殊技能,原来是用了大杀器,那不还是用空间换时间的套路嘛,害,所以所谓更优来来回回也就这点儿事儿,理解了这一点,思路就打开了。

那他是怎么用一层循环加哈希表就搞定的呢?重点就是用了哈希表,给遍历过程赋予了记忆的能力,即已经遍历过哪些元素会在哈希表中单独存一份以备后续使用,且哈希表的查找复杂度为 O(1),很容易就能判断一个元素是否存在,有了这两个能力,就很简单了。每次遍历到元素num[i]时,target - num[i] 就是我们要找的元素,所以我们只要判断在哈希表中有没有 target - num[i] 就可以了。
但记忆能力还不是用哈希表的唯一原因,如果我们只需要将遍历过的元素记下来并判断是否需要,那用 HashSet 就可以了,但很显然,HashSet 只能存单个元素,不能存键值对,当我们想获取目标元素的索引时就不行了,所以将目标元素的索引存为哈希节点的 value 中就能轻易拿到了。
谈到哈希表,其查找能力在算法题解中用到的最多,此外还可借助映射特性汇总一组数据中每个 Key 对应的统计值。

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

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

相关文章

大模型应用RAG系列(1)初识RAG

题外话 之前我们在讲大模型的应用方向和架构时&#xff0c;有提到RAG、Agent、Fine-Tune。在作者写大模型专题的文章时&#xff0c;也是边学习&#xff0c;边梳理&#xff0c;边总结。在这个过程中&#xff0c;大模型在各个方向都不断地快速发展&#xff0c;对应的paper、理论…

电商价格监测的价值是什么

品牌做电商价格监测的原因多是为了渠道管控&#xff0c;即控价&#xff0c;管控价格前需要对渠道中的价格数据进行监测&#xff0c;通过监测价格&#xff0c;对渠道中低价数据进行全面的了解&#xff0c;如有授权低价率&#xff0c;非授权低价率&#xff0c;非授权低价店铺的总…

陶粒砂加气砌块中墙建材宝山奉贤崇明吴江姑苏虎丘aac加气砌块松江青浦吴中相城轻质砖苏州黄浦杨浦加气块闵行嘉定金山

陶粒砂加气砌块中墙建材宝山奉贤崇明吴江姑苏虎丘aac加气砌块松江青浦吴中相城轻质砖苏州黄浦杨浦加气块闵行嘉定金山 陶粒砂加气砌块是一种轻质、多孔的建筑材料&#xff0c;通常由水泥、细骨料&#xff08;如陶砂&#xff09;、粗骨料&#xff08;如陶粒&#xff09;、发泡剂…

蓝桥杯-网络安全-练习题-crypto-rsa

共模攻击 直接脚本即可 import libnum import gmpy2import random random.seed(123456)e1 random.randint(100000000, 999999999) print(e1) e2 65537 n 7265521127830448713067411832186939510560957540642195787738901620268897564963900603849624938868472135068795683…

MySQL创建数据库与表

要求&#xff1a; 1.在本机安装数据库 2.创建一个数据库db_classes 3.创建一行表db_hero 4.将四大名著中的常见人物插入这个英雄表 目录 要求&#xff1a; 过程&#xff1a; 结果&#xff1a; 命令总结&#xff1a; 过程&#xff1a; 1.安装数据库 http://t.csdnimg…

浅识数据结构之空间复杂度

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文章目录 一. 前言二. 空间复杂度2.1 概念2.2 常见的空间复杂度2.3 不常见的空间复杂度&#x…

`THREE.AudioAnalyser` 音频分析

demo案例 THREE.AudioAnalyser 音频分析 入参 (Input Parameters): audio: 一个 THREE.Audio 实例&#xff0c;代表要分析的音频。fftSize: 快速傅里叶变换&#xff08;FFT&#xff09;的大小&#xff0c;用于确定分析的精度和频率分辨率。smoothingTimeConstant: 平滑时间…

CSDN文章无法修改和发布问题解决方法一例

CSDN文章无法修改和发布问题解决方法一例 在多次点击保存准备发布文章时&#xff0c;提示网络错误&#xff0c;请求超时 我的解决办法是&#xff1a;更换网络&#xff0c; 如果你是连着网线&#xff0c;就换成 WIFI或使用自己的手机热点连接。 如果你是连着 WIFI&#xff0c;…

BAPI_BATCH_CHANGE:修改批次的特征值

文章目录 BAPI_BATCH_CHANGE&#xff1a;修改批次的特征值实现步骤定义变量获取对象/类等 获取已维护特性值新特性值更新 注意事项常见的错误&#xff1a;Object xxx does not exist 最终效果字段介绍正式测试-310测试环境&#xff08;HS&#xff09;特性值数据内表介绍运行效果…

【MySql】MySQL查询中的笛卡尔积现象解析

还有多少个十年 能勇敢做热血青年 还有多少个十年 能坚持当初的信念 还有多少个十年 能不忘怀回忆点点 &#x1f3b5; 《还有多少个十年》 在使用MySQL或任何关系型数据库进行多表查询时&#xff0c;如果连接条件设置不当&#xff0c;就可能发生所谓的笛卡…

radware负载均衡简介及应用场景

Radware负载均衡是一种高效的网络性能优化技术&#xff0c;广泛应用于确保服务的高可用性和可靠性。以下是关于Radware负载均衡的简介及其应用场景的详细介绍&#xff1a; 简介&#xff1a; Radware的AppDirector&#xff08;AD&#xff09;是公司提供的负载均衡解决方案&…

关于加强电力系统通信与电网调度自动化建设问题的规定

关于加强电力系统通信与电网调度自动化建设问题的规定 为了保障电力系统安全、经济、优质、可靠运行&#xff0c;必须加强电网调度管理和提高技术装备水平。根据当前电网技术装备状况&#xff0c;结合电力系统通信和电网调度自动化的特点&#xff0c;以及今后规划发展的要求&am…

【每日力扣】41. 缺失的第一个正数 238. 除自身以外数组的乘积 189. 轮转数组

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为…

Linux 操作系统的引导过程

Linux系统开机引导过程&#xff1a; 开机自检 检测硬件设备&#xff0c;找到能够引导系统的设备&#xff0c;比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

API 开发的后盾:平台工程提供强力动态支持

过去几年&#xff0c;开发团队一直在发展传统的 DevOps。一些开发人员认为&#xff0c;CloudOps 或 DeploymentOps 等新实践的兴起将会导致回到孤岛问题。其他人则不愿意在承担所有其他职责之外构建、部署、运行和维护运维。显然&#xff0c;确实需要新的云原生开发策略&#x…

YesPMP众包平台最新项目

YesPMP一站式互联网众包平台&#xff0c;最新外包项目&#xff0c;有感兴趣的用户可进入平台参与竞标。 &#xff08;竞标后由项目方直接与服务商联系&#xff0c;双方直接对接&#xff09; 1.查看项目&#xff1a;个人技术-YesPMP平台 2.查看项目&#xff1…

用Python编写一个简单的数字累加器 数字累加器

目录 一.总体说明 二.完整代码 三.逐行分析 一.总体说明 数字累加器是一种用于对数字进行持续累加的设备或算法。它可以在每次输入一个数字时将其与之前的累加结果相加,并更新累加结果。数字累加器通常用于计算总和、平均值或其他需要对连续数字进行累加的应用场景。 在计…

Android apk打包有so,运行没有so

Android apk打包有so&#xff0c;运行没有so 当minSdkVersion版本从19变成26时&#xff0c;编译打包后&#xff0c;安装到设备里发现 /data/data//lib 目录下没有so库&#xff0c;在AndroidManifest文件application标签下增加android:extractNativeLibs"true"后&…

命名空间:namespace

对于无名命名空间 &#xff1a;但是不能再次定义相同名称的变量 在同一文件中

CUDA 下 DGL 库安装

https://www.dgl.ai/pages/start.html pip install dgl -f https://data.dgl.ai/wheels/cu121/repo.html成功o(&#xffe3;▽&#xffe3;)ブ ⭐⭐