Leecode 1.两数之和(Java 哈希表)
·
官方答案:
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是更常见的写法,保持跨语言代码风格统一。
更多推荐


所有评论(0)