数组--[1]两数之和/easy 理解度A

本文介绍了如何使用哈希表解决‘两数之和’问题,提供了解题思路、复杂度分析和示例代码,重点在于时间复杂度小于O(n^2)的优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目

给定一个整数数组 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) 的算法吗?

Related Topics
  • 数组
  • 哈希表

2、解题思路

  1. 将数组转成哈希表,key是数组值,value是数组值所对下标
  2. 遍历数组,直到结束
    2.1 求得 预期差 = target - 当前下标值
    2.2 判断预期差是否存在步骤1的哈希表,存在则哈希值与当前数组下标值组成一对,结束循环。否则继续循环

3、复杂度最优解示例

    public int[] twoSum(int[] nums, int target) {
        // 1. 将数组转成哈希表,key是数组值,value是数组值所对下标
        Map<Integer, Integer> numsMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            numsMap.put(nums[i], i);
        }
        // 2. 遍历数组,直到结束
        int[] towNum = new int[2];
        for (int i = 0; i < nums.length; i++) {
            // 2.1 求得 预期差 = target - 当前下标值
            int differ = target - nums[i];
            // 2.2 判断预期差是否存在步骤1的哈希表,存在则哈希值与当前数组下标值组成一对,结束循环。否则继续循环
            // 踩坑:下面的 index 不能使用基本类型,因为哈希表 get() 可能返回 null
            Integer index = numsMap.get(differ);
            if (Objects.nonNull(index) && index != i) {
                towNum[0] = i;
                towNum[1] = index;
            }
        }
        return towNum;
    }

4、抽象与扩展

  1. 场景抽象:
    ①存在一批数据
    ②存在一条规则,满足下面 2 个特性:
    该规则可以将任意 2 个数据(A、B)进行关联,并转化成特定结果©。
    且该规则具有可逆性,即特定结果©跟任意数据(A)进行关联,可以得出另一个数据(B)
    ③已知预期结果,问这批数据存在哪 2 个数据经过这条规则后,能够得到该预期结果
  2. 解题套路:
    ①将这批数据用哈希表存储
    ②遍历完所有数据,做以下操作:
    将特定结果©与当前遍历值(A)进行规则的关联,得出另一个数据(B),判断数据(B)是否存在于哈希表中,存在,则当前遍历值(A)与另一个数据(B)组成一对,结束循环。否则,继续遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值