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

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

作leetcode題目的時候,常常百度答案,但感受大多不是我想要的,不少我不能理解。如今也作了一些算法題,哪些並非很深奧,但須要一些技巧,簡單的算法題更多的是經驗值。這裏,開啓算法題篇章。給本身記憶,但願不要誤人子弟。數組

題目

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

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

示例:spa

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

由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]複製代碼

解題

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

理解:

1:在一個整數數組中,一定有兩個數相加等於target。code

2:須要記錄這兩個數的下標,合成數組返回cdn

爲何暴力破解不佳:

在大多數沒有作過算法題的思惟下,第一選擇方案是暴力破解,但這個時間複雜度是成指數增加的。若是這個數組是一千個,兩個for循環進行計算,也就是要計算一千的平方。這樣太消耗時間和內存。blog

HashMap解題:

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

整理一下思路

1:數組中有numberA + numberB = target

2:target - numberA = numberB

3:數組的會有一個數被 target減去以後獲得的數,一定存在這個數組中

須要作的:

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


這裏選擇記錄用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
複製代碼
相關文章
相關標籤/搜索