Leetcode --- NO.1 兩數之和

兩數之和 — Java

題目如圖所示:
題目看到這個題目的第一眼,內心不屑的說了一聲切,簡直侮辱我智商
表情包1
然後呢,本着我很強,但是也還是要做的心情,三下五除二寫了兩個for循環
在這裏插入圖片描述
一頓操作,執行代碼,提交,一氣呵成
在這裏插入圖片描述
老天是公平的,他不會讓你得瑟很久的
運行結果一出來
what?????
結果怎麼可能,才50%!!
用時分佈圖
哇,這也太太太太太打擊人了吧,怎麼前面的能夠這麼多!!
在這裏插入圖片描述
咱好歹也是學過數據結構的,不行,去 抄抄 借鑑一下他們的先
就那個最前面的吧,看着就很強的亞子

看這代碼
看這結構
實在是。。。。
妙啊!!!
在這裏插入圖片描述
其實這個題目的難點在於找到那個數,找數無非就是遍歷,然後判斷,程序耗時也就是消耗在遍歷這裏,看了一下其他的題解,大多用到了 HashMap.

而這裏使用的是一種類似於自己創建一個簡單的哈希表的方法,indexArrays爲那個哈希表,indexArrays中存放的其實是nums中元素的位置

其中的diff & indexArrayMax ,一是爲了解決可能存在的負數的情況,二是爲了解決nums中數值過大的情況,& indexArrayMax能夠使nums中無論是什麼數都能被約束到0-2047之間。

總的來說,這樣做是比java自帶的hashmap要快一點,但是思路是一樣的

至於哈希表是什麼意思。。。
翻書去!!!

用時1ms
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int indexArrayMax = 2047;
        int[] indexArrays = new int[indexArrayMax + 1];
        for (int i = 0; i < nums.length; i++) {
            int diff = target - nums[i];
            int index = diff & indexArrayMax; //控制下標索引始終爲正
            if (indexArrays[index] != 0) {
                return new int[] { indexArrays[index] - 1, i };
            }
            indexArrays[nums[i] & indexArrayMax] = i + 1;
        }
        throw new IllegalArgumentException("No two sum value");
    }
}
leetcode官方方法
class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            int left = target - nums[i];
            if(map.containsKey(left)){
                return new int[]{map.get(left),i};
            }
            map.put(nums[i],i);
            }
        throw new IllegalArgumentException("No two sum value");
    }
}

恬不知恥的把自己的也放上來
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] c = new int[2];
        for(int a=0;a<nums.length;a++){
            for(int b=a+1;b<nums.length;b++){
                if(nums[a]+nums[b] == target){
                    c[0] = a;
                    c[1] = b;
                }
            }
        }
        return c;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章