算法擼一遍,從簡單的開始。算法
作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
再來看一下理解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
複製代碼