簡單演算法題:leetcode-1 兩數之和

楚棠發表於2019-03-15

演算法擼一遍,從簡單的開始。

做leetcode題目的時候,經常百度答案,但感覺大多不是我想要的,很多我不能理解。現在也做了一些演算法題,哪些並不是很深奧,但需要一些技巧,簡單的演算法題更多的是經驗值。這裡,開啟演算法題篇章。給自己記憶,希望不要誤人子弟。

題目

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

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

示例:

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

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]複製程式碼

解題

這是LeetCode演算法題庫的第一個演算法題,比較簡單。題目讀一遍,然後整理一下題目的意思。

理解:

1:在一個整數陣列中,必定有兩個數相加等於target。

2:需要記錄這兩個數的下標,合成陣列返回

為什麼暴力破解不佳:

在大多數沒有做過演算法題的思維下,第一選擇方案是暴力破解,但這個時間複雜度是成指數增長的。如果這個陣列是一千個,兩個for迴圈進行計算,也就是要計算一千的平方。這樣太消耗時間和記憶體。

HashMap解題:

再來看一下理解1,在這個陣列中必定有兩個數相加是等於target。

整理一下思路

1:陣列中有numberA + numberB = target

2:target - numberA = numberB

3:陣列的會有一個數被 target減去之後得到的數,必定存在這個陣列中

需要做的:

1:記錄下被target減去得到的數,和當前計算數在陣列中的下標

簡單演算法題:leetcode-1 兩數之和

這裡選擇記錄用HashMap,這裡就沒有個大家講解HashMap了。知道它的Api使用就可以了。

Map map = new HashMap();
map.put(key,var);//存
var = map.get(Key)複製程式碼

程式碼:

public static int[] twoSum(int[] nums,int target){
    int var ;
    Map<Integer,Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < nums.length; i++) {
        Integer integer = map.get(nums[i]); //檢視是否迴圈到了減去之後得到的值
        if (integer != null){ //如果不為null,說明找的值找到了
            return new int[]{integer,i};
        }
        var = target - nums[i]; //得到當前減去之後得到的數
        map.put(var,i);//記錄每一個被減之後得到的值,和當前下標
    }
    return null;
}複製程式碼

main方法

public static void main(String[] age){
    int[] a = {2, 7, 11, 15};
    int[] ints = twoSum(a, 9);
    if (ints == null){
        System.out.println("沒有找到");
    }
    for (int anInt : ints) {
        System.out.println(anInt);
    }
}複製程式碼

列印結果

0
1
複製程式碼


相關文章