1 两数之和(map、快慢指针)
发布日期:2021-05-07 21:50:42 浏览次数:24 分类:精选文章

本文共 1057 字,大约阅读时间需要 3 分钟。

问题描述

给定一个整数数组 nums 和一个目标值 target,需要在数组中找到两个不同的整数,使得它们的和等于目标值,并返回这两个整数的下标。

思路分析

解决这个问题可以采用多种方法,以下是几种常见的解决思路:

  • 递归方法:使用两个指针分别从数组的两端开始,向中间移动,直到找到和为目标值的两个数。这种方法的时间复杂度为 O(n^2),在数组较长时可能效率较低。

  • 哈希表结合快慢指针法:首先使用哈希表记录每个数值的下标,然后对数组进行排序,使用快慢指针查找和为目标值的两个数。这种方法的时间复杂度为 O(n log n),在处理重复数值时需要注意下标的正确记录。

  • 官方优化方法:使用一次遍历和哈希表,快速找到补数,适用于大部分情况,时间复杂度为 O(n),代码简洁高效。

  • 代码实现

    以下是基于官方优化方法的高效实现:

    import java.util.HashMap;
    import java.util.Map;
    class Solution {
    public int[] twoSum(int[] nums, int target) {
    Map
    map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
    int complement = target - nums[i];
    if (map.containsKey(complement)) {
    return new int[] { map.get(complement), i };
    }
    map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
    }
    }

    代码解释

  • 初始化哈希表:使用 HashMap 记录每个数值及其对应的下标。
  • 遍历数组:对于每个数值,计算其补数(目标值减去当前数值)。
  • 查找补数:如果补数存在于哈希表中,返回补数对应的下标及当前数值的下标。
  • 记录数值:如果补数不存在,将当前数值及其下标记录到哈希表中。
  • 处理异常情况:如果遍历完数组无果,抛出异常,符合题目要求的唯一解。
  • 这种方法在时间复杂度和代码简洁性上都非常出色,适用于大多数情况。

    上一篇:40. 组合总和 II(dfs、set去重)
    下一篇:22 括号生成(暴力、递归)

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年03月20日 22时26分25秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章