欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

力扣 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 这篇帖子

相关标签: 力扣 力扣