[面试精选] 0001. 两数之和

文章目录

      • 1. 题目链接
      • 2. 题目描述
      • 3. 题目示例
      • 4. 解题思路
      • 5. 题解代码
      • 6. 复杂度分析

1. 题目链接


1. 两数之和 - 力扣(LeetCode)


2. 题目描述


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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

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

3. 题目示例


示例 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]

4. 解题思路


  • **哈希表: **使用哈希表来存储已经遍历过的数字及其索引,在O(1)时间内检查是否存在目标值(tar - x)。
  • 一次遍历:对于每个元素,检查哈希表中是否存在对应的补数(即tar - x),如果存在则立即返回结果。

5. 题解代码


class Solution {
    public int[] twoSum(int[] nums, int tar) {
        // 创建一个哈希表来存储数字和对应的索引
        Map<Integer, Integer> idx = new HashMap<>();
        
        // 遍历数组
        for (int i = 0; ; i++) {
            int x = nums[i]; // 当前数字
            
            // 检查哈希表中是否存在目标值(tar - x)
            if (idx.containsKey(tar - x)) {
                // 如果存在,返回这两个数的索引
                return new int[]{idx.get(tar - x), i};
            }
            
            // 将当前数字及其索引存入哈希表
            idx.put(x, i);
        }
    }
}


6. 复杂度分析


  1. 时间复杂度
    • 遍历数组一次:O(n),其中n是数组的长度。
    • 哈希表的插入和查找操作均为O(1)。
    • 总时间复杂度:O(n)。
  2. 空间复杂度
    • 哈希表存储最多n个数字及其索引:O(n)。
    • 总空间复杂度:O(n)。

你可能感兴趣的:(算法,面试精选)