力扣 1.两数之和

在该题中 很容易想到用暴力法来解决 

直接进行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 这篇帖子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章