1. 程式人生 > 實用技巧 >LeetCode2-兩數之和

LeetCode2-兩數之和

目錄


本題是leetcode,地址:1. 兩數之和

題目

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

你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。

示例:

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

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

解題思路:

兩遍雜湊表

一個簡單的實現使用了兩次迭代。在第一次迭代中,我們將每個元素的值和它的索引新增到表中。然後,在第二次迭代中,我們將檢查每個元素所對應的目標元素(target - nums[i]target−nums[i])是否存在於表中。需要注意的是該目標元素不能是 nums[i]nums[i] 本身!

一遍Hash

在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。

code

public class LeetCode2 {

    public static int[] twoSum(int[] nums, int target) {
        int[] res = new int[]{-1,-1};

        Map<Integer,Integer> numsMap = new HashMap<>(8);
        for(int i = 0; i < nums.length; i ++) {
            int value = nums[i];
            numsMap.put(value,i);
        }
        for(int i = 0; i < nums.length; i ++) {
            int value = nums[i];
            Integer index = numsMap.get(target - value);
            if(index != null && index != i) {
                res[0] = i;
                res[1] = index;
                break;
            }
        }
        return res;
    }


    public static int[] twoSum2(int[] nums, int target) {
        int[] res = new int[]{-1,-1};
        Map<Integer,Integer> numsMap = new HashMap<>(8);
        for(int i = 0; i < nums.length; i ++) {
            int value = nums[i];
            numsMap.put(value,i);
            Integer index = numsMap.get(target - value);
            if(index != null && index != i) {
                res[0] = index;
                res[1] = i;
                break;
            }
        }
        return res;
    }



    public static void main(String[] args) {
        int[] nums = new int[]{3,2,4};
        int target = 6;
        int[] res = twoSum2(nums,target);
        System.out.println();
    }
}

你的鼓勵也是我創作的動力

打賞地址