大家都說 演算法 是程式設計師的分水嶺, 三年 技術一個坎。
我工作2年已經感覺到危機感,正準備同時這面臨著兩個問題了,不如蹭現在還有來得及一起去把演算法練起來吧,光看可不行得練。儘可能的把 https://leetcode-cn.com/
Leetcode 力扣 中的演算法題都刷一遍。
遵循:先用自己的可以實現的方法做,做出來後,在看看大佬們的效能解法學習學習。 (連自己的方法都做不出來,只能偷偷的看看答案了xixixi~,不管是白貓黑貓抓到老鼠就是好貓,先要求自己做對,再最求效能)
我也會把 Leetcode 力扣 上做的題目程式碼,放在 GitHub 上進行同步,方便大家查閱程式碼,給出你的 Pr 和提出 issues 。
GitHub: https://github.com/aquanlerou/leetcode
兩數之和(TwoSum)
首先我們先看看題目描述:
給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
我第一時間看到題目後想法,逐個逐個迴圈nums[]
相加得出結果後,判斷結果是否與 target
相等,相等後就跳出迴圈,這個估計是最笨的辦法了。
-
遍歷陣列兩兩相加得出結果
-
迴圈中判斷是否與目標數相等
- 相等跳出迴圈,記錄數值的位置
- 不相等繼續迴圈相加
-
最後把記錄的數值
return
返回
上程式碼:
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
int a = 0;
int b = 0;
for(int i=0 ; i <=n; i++) {
for(int j=i+1; j<n; j++) {
int result = nums[i] + nums[j];
if(result == target) {
a = i;
b = j;
}
}
}
int[] resultArray = new int[]{a, b};
return resultArray;
}
這種解法,估計就是速度慢和效能上消耗大了。這裡我還無法用什麼 時間複雜度 和 空間複雜度 去評論,因為我不懂 doge-,-
,下面得好好了解下才行了。
Dalao 解法
看完解法後,瞭解到是利用到了HashMap
中的containsKey
方法查詢Map
中Key
降低耗時。
-
迴圈遍歷
- 把
nums[]
中的值已Key
形式,和對應值的nums[]
的下標已value
形式存進Map
中 - 迴圈中進行
target - nums[i]
計算 - 計算結果通過
containsKey
方法在Map中查詢是否有對應值 - 有的話就返回
map.get(target - nums[i])
和迴圈的次數i
- 我們最後還是得考慮下要是陣列中沒有對應的結果應該怎麼處理,這個時候我們返回
-1,-1
- 把
程式碼:
public int[] twoSumHash(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i=0; i<nums.length; i++) {
int result = target - nums[i];
if (map.containsKey(result)) {
return new int[] {map.get(result), i};
}
map.put(nums[i], i);
}
return new int[] {-1, -1};
}
最後希望大家可以理解得了,可能會描述的不清楚。
本作品採用《CC 協議》,轉載必須註明作者和本文連結