当前位置: 首页 > news >正文

1. 两数之和

1. 两数之和

暴力法

思路
两层for循环,外层for循环i遍历数组元素,内层for循环j遍历[i+1, n-1]范围内剩余元素,若nums[i]+nums[j] = target,返回[i,j]。

哈希表(map)

思路
一层for循环i遍历数组元素,判断当前元素nums[i]的另一半(target - nums[i])是否在哈希表map中。
若在,返回这两个元素下标;
若不在,将当前元素nums[i]及下标i加入map中。

本质是用哈希表(map)优化了暴力法中的第二层for循环,本解法使用 unordered map数据结构,从map中查找元素时间复杂度为O(1),相当于用空间换取时间,将暴力法第二层for循环时间复杂度降到O(1)。

进阶

  • 为什么想到用哈希表?
    哈希表适用场景:(1)判断一个元素是否在集合中。(2)判断一个元素是否在集合中出现过。
    暴力法第二层for循环目的是从子数组中查找一个元素

  • 为什么用哈希表(map)?
    可用三种数据结构实现哈希表:数组、set、map。
    数组:数组长度固定,初始化后不能更改。数组长度必须大于元素最大数量。
    set:元素不重复,可增删元素。
    map:存储(key, value)键值对,key不重复。
    本题nums元素最多为10^4,若采用数组实现哈希表,浪费存储空间。若使用set,则无法同时存储数组元素及下标。使用map实现哈希表,key存储数组元素,value存储下标。

  • map中存储什么?
    map中存储(key, value)对,key不重复。

  • map的key存储什么?value存储什么?
    key存储数组元素,value存储下标。

class Solution {public int[] twoSum(int[] nums, int target) {// 哈希表(unordered map),key 存储数组元素,value 存储下标Map<Integer, Integer> map = new HashMap<>();int[] res = new int[2]; // 存储和为 target 的元素下标for (int i = 0; i < nums.length; i++) {// 判断 nums[i] 的另一半(target - nums[i])是否在 map 中int key = target - nums[i];if (map.containsKey(key)) { // 在 map 中查找是否有与 nums[i] 匹配的 keyres[1] = i;res[0] = map.get(key);break;} else {map.put(nums[i], i); // 不匹配,把当前访问的元素及下标加入 map 中}}return res;}
}
http://www.hskmm.com/?act=detail&tid=33862

相关文章:

  • CSP-S模拟34/2025多校冲刺CSP模拟赛6
  • PostgreSQL 逻辑结构
  • 随机数技术
  • Java学习通互评5
  • 卡车厂实习第三天
  • 第六周作业---定时器
  • 『普及』浅谈图的基础
  • 被C语言链表折磨的一天 Σ( △ |||)︴
  • 运筹学在供应链优化中的实际应用
  • P6715 [CCO 2018] Fun Palace 题解
  • WebGL学习及项目实战(第03期:绘制多个点,线,面)
  • CF 359D. Pair of Numbers
  • 2025多校CSP模拟赛6
  • Java基础——类型转换,变量、常亮、作用域,基本运算符
  • 洛谷 LGR-246 S 模拟赛
  • godot3D节点本身的偏转数值错误竟会导致空间移动穿模??!
  • 题解:qoj7938 Graph Race
  • java中的初等函数
  • 分治算法
  • 专用硬件神经网络优化技术解析
  • 学习逆向的背景知识(自用)
  • Linux-网络安全私房菜(二)
  • pycharm使用远程的ssh的解释器
  • Android SSL Pinning检测利器:SSLPinDetect技术解析
  • AI元人文:社区调解的数字剧场
  • 2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!
  • Dubbo入门-Dubbo的快速使用
  • 站位2
  • 傅里叶变换及DCT点滴
  • 【未完待续】MkDocs 部署安装教程