演算法擼一遍,從簡單的開始。
做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減去得到的數,和當前計算數在陣列中的下標
這裡選擇記錄用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
複製程式碼