leetcode刷題——1、兩數之和

接下來一年裏,打算好好刷一下leetcode題,所以會有個完整的記錄~

順便在刷題時,也會記錄下一些數據結構的用法~

 

1、兩數之和:(題目來源:LeetCode,地址是: https://leetcode-cn.com/problems/two-sum/

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:給定 nums = [2, 7, 11, 15], target = 9

因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

2、先看一下官方解法吧,然後是我自己的解法(很蠢,純粹記錄一下):

(1)官方的很好懂:地址是:

https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/

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");
    }
}

(2)然後看評論說是java第一的解法,具體解釋自己上leetcode看吧~

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");
    }
}

3、談下我做題時出現的問題(運行時都通過,但是提交時失敗,正式提交的測試用例情況比較多)

(剛開始做leetcode,比較蠢,大佬們忽略,我就記錄下)

(1)剛開始直接從數組兩端指針往中間移,想着nums[i]+nums[j]看和是大了還是小了就往左還是右移-----但是數組沒排序

(2)第二次傻逼的直接用Arrays.sort(nums)排序了,但是數組下標就亂了。

(3)第三次用map(nums[p],p)這樣建了個map存放原始數據,然後數組再排序,這麼放是想直接map.get(nums[i])就獲得下標了---但是問題是,nums[p]可能有重複值。

(4)然後就老老實實寫了個原始的,很蠢,代碼如下:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int p=0;p<nums.length;p++){
            map.put(p,nums[p]);
        }
        Arrays.sort(nums);
        int i=0;
        int j=nums.length-1;
        for(int p=0;p<nums.length;p++){
            if(nums[i]+nums[j]==target){
                //直接返回
                break;
            }else if(nums[i]+nums[j]>target){
                j=j-1;
                continue;
            }else{
                i=i+1;
                continue;
            }
        }
        int m=0;int n=0;
        for(Integer getKey:map.keySet()){
            if(map.get(getKey).equals(nums[i])){
                m=getKey;
                map.remove(getKey);
                break;
            }

        }

         for(Integer getKey:map.keySet()){
            if(map.get(getKey).equals(nums[j])){
                n=getKey;
                break;
            }

        }
         int[] result={m,n};
         return result;
    }
}

很蠢的通過了。。。。。

 

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