力扣经典150题第四十三题:两数之和

简介: 力扣经典150题第四十三题:两数之和

力扣经典150题第四十三题:两数之和

题目描述

给定一个整数数组 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]

解题思路

一种简单的解决方案是使用哈希表(HashMap)来存储每个元素的值及其索引。我们遍历数组,对于每个元素 nums[i],计算目标值 complement = target - nums[i]。然后检查哈希表中是否存在 complement,如果存在则说明找到了答案,返回对应的索引。如果不存在,则将当前元素存入哈希表中。

完整代码
import java.util.HashMap;
import java.util.Map;
public class TwoSum {
    public int[] twoSum(int[] nums, int target) {
        // 创建哈希表,用于存储元素值和对应的索引
        Map<Integer, Integer> map = new HashMap<>();
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            // 检查哈希表中是否存在 complement
            if (map.containsKey(complement)) {
                // 找到了满足条件的两个数,返回它们的索引
                return new int[] { map.get(complement), i };
            }
            // 将当前元素存入哈希表中,值作为 key,索引作为 value
            map.put(nums[i], i);
        }
        // 如果未找到符合条件的两个数,返回空数组
        return new int[] {};
    }
    public static void main(String[] args) {
        int[] nums1 = {2, 7, 11, 15};
        int target1 = 9;
        TwoSum solution = new TwoSum();
        int[] result1 = solution.twoSum(nums1, target1);
        System.out.println("示例 1 结果:" + Arrays.toString(result1));
        int[] nums2 = {3, 2, 4};
        int target2 = 6;
        int[] result2 = solution.twoSum(nums2, target2);
        System.out.println("示例 2 结果:" + Arrays.toString(result2));
        int[] nums3 = {3, 3};
        int target3 = 6;
        int[] result3 = solution.twoSum(nums3, target3);
        System.out.println("示例 3 结果:" + Arrays.toString(result3));
    }
}
复杂度分析
  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们只需遍历一次数组,哈希表的插入和查找操作均为 O(1) 的时间复杂度。
  • 空间复杂度:O(n),其中 n 是数组 nums 的长度。哈希表最多存储 n 个元素。
总结与结语

本题利用哈希表的快速查找特性,通过一次遍历数组即可找到和为目标值的两个元素。这种解法的时间复杂度为 O(n),空间复杂度也为 O(n),是一种高效的解决方案。

哈希表的使用在解决数组和字符串相关的问题中具有广泛的应用,能够有效地降低时间复杂度。

通过掌握哈希表的基本原理和操作,能够更加高效地解决类似的算法问题,提高编程的技能和效率。

感谢您阅读本文,希望本文能帮助您更好地理解和掌握解决这道经典的算法问题!
相关文章
|
1月前
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
27 0
Leetcode第一题(两数之和)
|
1月前
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
14 0
|
3月前
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
3月前
|
算法
LeetCode第1题两数之和
该文章介绍了 LeetCode 第 1 题两数之和的解法,通过使用 HashMap 来记录数组元素及其下标,以 O(n)的时间复杂度解决问题。
|
3月前
|
JavaScript 前端开发 PHP
leetcode——两数之和【一】
leetcode——两数之和【一】
27 0
|
3月前
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
39 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
28 1
|
5月前
力扣-两数之和
力扣-两数之和
|
5月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
5月前
|
存储 算法 Java
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
30 1