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

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