leetCode 1:兩數之和

leetcode 1:兩數之和

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

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

示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法一

暴力解法,這個只要找到一個解就可以,我們可以遍歷兩遍數組。
 public int[] twoSum(int[] nums, int target) {
        
        for(int i=0;i<nums.length;i++){
           int j = i+1;
            while(j<nums.length){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
                j++;
            }
        }
        return null;
    }

解法二

以空間換時間,用hashMap裏面有個contains方法,我們首先遍歷一遍數組,把裏面的數據全都放map裏面去.
之後遍歷數組,數組中的每個元素,找同target的差是否在map裏面。這個地方要注意,找到的那個value不能等於i。
public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++)
        {
            map.put(nums[i],i);
        }
        for(int i=0;i<nums.length;i++){
            int a = target - nums[i];
           if(map.containsKey(a)&& map.get(a)!=i){
               return new int[]{i,map.get(a)};
           }
        }
        return null;
    }

解法三

不直接遍歷數組把元素都放到map裏面,這樣的話會多一遍循環,直接一遍循環過去,這個我現在能想通爲什麼,但是話到嘴邊,不知道怎麼說。
 public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int a = target - nums[i];
           if(map.containsKey(a)&& map.get(a)!=i){
               return new int[]{i,map.get(a)};
           }
           map.put(nums[i],i);
        }
        return null;
    }
準備以後每天一道吧,今天這個是LeetCode上第一道題,比較簡單,但感覺也能讓人眼前一亮。以後每天一道,寫博客明志。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章