官方答案:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<>();  // 创建哈希表
        for (int i = 0; i < nums.length; ++i) {             // 遍历数组
            if (hashtable.containsKey(target - nums[i])) {  // 检查补数是否存在
                return new int[]{hashtable.get(target - nums[i]), i};  // 返回结果
            }
            hashtable.put(nums[i], i);                      // 存储当前元素
        }
        return new int[0];  // 无解时返回空数组(题目保证有解,实际可省略)
    }
}

    时间复杂度:O(N),其中 N 是数组中的元素数量。使用哈希表对于每一个元素 x,我们可以 O(1) 地寻找 target - x

    算法逻辑:边遍历边存储,确保补数来自已处理元素

    代码执行流程如下(以 nums = [2,7], target = 9为例):

    初始化哈希表hashtable = new HashMap<>()(空表)。

    遍历数组:
    (1)i=0(元素 2):

    计算补数:9 - 2 = 7;

    检查哈希表中是否存在 7→ 不存在;

    2存入哈希表:hashtable = {2:0}

    (2)i=1(元素 7):

    计算补数:9 - 7 = 2;

    检查哈希表中是否存在 2→ 存在(索引 0);

    返回结果 [1],循环终止。

    笔记:

     一、Java中哈希表的使用方法

    1、定义哈希表

    Map<Integer, Integer> hashtable = new HashMap<>();

    此时key为整型,value为整型。如果value为字符型的话:

    Map<Integer, Character> hashTable = new HashMap<>();

    2、存储哈希表元素

    hashTable.put(key,value);

    当key=2,value=3时:

    hashTable.put(2,3);

    判断hashTable中是否包含某个key,例如判断是否包含2这个key,可以用

    hashTable.containsKey(2);

    返回类型是boolean
    判断hashTable中某个key的value,例如判断key=2时对应的value,可以用

    hashTable.get(2);

    返回值为value类型

    二、++i与i++

    官方代码第四行为什么使用++i,而不使用i++。

    首先i++,需要先保存当前值(临时变量),再执行自增操作,最后返回临时变量。

    int temp = i;  // 保存原值
    i = i + 1;     // 自增
    return temp;   // 返回原值

    ++i直接执行自增操作,返回自增后的值,无需创建临时变量。

    i = i + 1;     // 自增
    return i;      // 返回新值

    1、性能差异

    现代 JVM 会优化这两种操作,实际运行时性能几乎无差异。

    但在极端高频循环(如 10 亿次)中,++i可能略快(因避免临时变量开销)。

    2、代码习惯

    尽管性能差异可忽略,但 ++i更符合“先操作后使用”的直觉,尤其在涉及复杂类型时更安全。

    在多数编程语言(如 C/C++/C#)中,++i是更常见的写法,保持跨语言代码风格统一。

    Logo

    Agent 垂直技术社区,欢迎活跃、内容共建。

    更多推荐