力扣 1.两数之和
程序员文章站
2022-05-21 08:19:59
...
在该题中 很容易想到用暴力法来解决
直接进行n^2次寻找
此时 时间复杂度很高 而要降低时间复杂度 即减少查询次数
可以用hashmap 存储num[i] i
降低了寻找可能存在的对应数字的次数
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
而且在该题评论中 很有趣的是有同学做了暴力法和使用了哈希表的方法的比较:
我专门试了一下。程序肯定是针对大数据量才能看出差别,我就分别试了数组长度为一万、十万、百万的数组,并且查找次数保证最大。在一万的情况下,暴力**法差不多要15-30毫秒,而hash表则是0-15毫秒;在十万的情况下,暴力**法是1500-1700毫秒,而hash表则是15-40毫秒;百万级别的,hash表用了500-1500毫秒不等,但暴力**法我就执行了一次,152130毫秒。也去专门去查了hashMap.containsKey()的时间复杂度,使用指针指向数组引用,时间复杂度为O(1),未命中时,才回去遍历红黑树,时间复杂度为O(n),有兴趣的可以取看看 https://blog.csdn.net/qingtian_1993/article/details/80763381 这篇帖子
上一篇: LeeCode 两数之和
下一篇: 计算球的体积