大家好,我是你們的躍哥。平時躍哥在和大家溝通交流的時候,時不時地會被問到,躍哥,算法在工作中到底用不用得到啊?算法真的很重要麼?
這。。。平時的工作中,算法不一定能用到;但是如果你能在工作中用到算法,那麼你的工作就會變得更有意義,甚至是會讓你的程序有很大的提升。
今天躍哥就推薦大家看看,一個小夥伴寫的真實感想。
寫在前面
進入編程行業四年有餘了,如果你要是問我,對什麼領域的知識最陌生呢。首先排在我腦海裏面第一位的就是算法了。
算法其實我內心一直有一種排斥感,我也仔細分析了這個排斥感的原因,最主要的還是腦海中對於這一塊知識的空缺。
還有一個原因就是工作中,用到的地方實在是不多。畢竟,如果工作中天天在用的東西,你不想學會都是挺難得一件事情。
但是,想要往編程的領域進階,算法就是我心中必須邁過去的一座山。不管它是存在着多少困難。
問題就在那裏,目標就在那裏,機會也在那裏。不逃避,不害怕。慢慢刷題。需要一道一道的去刷去學習。
算法的學習依舊是有套路可以追尋的,依舊是可以通過大量反覆練習掌握的。
算法準備
去年的時候,陸陸續續購買了兩本算法相關的書籍,一本是《我的第一本算法書》、另外一本是《labuladong的算法小抄》。
《我的第一本算法書》是使用圖解的方式解釋了一些常見的數據結構和算法。當初考慮到,一點算法的基礎也沒有。
就想着圖解的方式可以使得自己學習算法的門檻降低一些。畢竟一上來就是困難模式,也害怕把自己的信心給減退了。
這本書的作者,提到了一個對算法很接地氣的理解,他指出,算法就是計算或者解決問題的步驟。可以把它想象爲食譜。
想要做出特定美味的料理,就需要遵守食譜上面的步驟。這本書看了一半多一點,對於算法入門和掌握一些數據結構還是有些收穫的。
而《labuladong的算法小抄》這本書,一直沒怎麼細讀,僅僅是侷限在偶爾無聊的時候,翻看了大概的目錄。聽說是一個在校大學生花費了兩年的時間,一心一意整理出來的算法刷題經驗。
想想自己的大學大多時間都用來賣零食了。真的是時間花費在哪裏,收穫可能就會在哪裏。付出時間和心血是能獲取收穫的必要充分條件了。但是,不是說付出了時間就一定會有收穫的。後面還是會將這本書細細閱讀學習起來。
今天,算是自己開始正兒八經刷算法學習的首日。第一步就是在 leetcode 註冊了一個賬號。挑選了一個簡單模式的題目入門。
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和爲目標值 的那 兩個 整數,並返回它們的數組下標。
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
1.第一種解法:雙層 for 循環
/**
* 力扣 暴力解法
* 輸入:nums = [2,7,11,15], target = 9
* 輸出:[0,1]
* 解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
* 第一次循環 9-2 看看是不是等於7
*/
public static int[] twoSum1(int[] nums, int target) {
//第一層循環是遍歷數組的每個元素
for (int i = 0; i <nums.length ; i++) {
//第二層循環是使用目標值減去比如第一個元素2看它的結果是否等於數組中其他三個元素,所以j就從i+1開始。
for (int j = i+1; j < nums.length; j++) {
int processNum = target - nums[i];
if(processNum == nums[j]){
//如果相等,就返回它們對應的數組下標
return new int[]{i,j};
}
}
}
return null;
}
2.第二種解法:使用 HashMap
/**
* 使用 HashMap
* 輸入:nums = [2,7,11,15], target = 9
* 輸出:[0,1]
* 解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
*/
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(16);
//遍歷數組中的元素
for (int i = 0; i < nums.length; i++) {
//使用目標值減去數組中的元素
int processNum = target - nums[i];
if (hashMap.containsKey(processNum)) {
//查看Map中是包含這個元素,包含就返回Map中這個值對應的下標與下標i
return new int[]{hashMap.get(processNum), i};
} else {
///Map中是不包含這個元素,第一次循環,就將這個數組的值nums[i]=2作爲Map的key值,i即是下標0放入到Map中
hashMap.put(nums[i], i);
}
}
return null;
}
第一次循環,nums[i] = 2,i 的下標等於 0,顯然,這個時候 Map 是空的,目標值 9-2 = 7,此時的 Map 中肯定是不含有 7 的。
那就將 nums[0]的值作爲 Map 的 key,數組下標 i=0 作爲 Value 存入到 HashMap 中。此時 HashMap<2,0>
第二次循環,nums[i] = 7,i 的下標等於 1。顯然,這個時候 Map 已經存在了 key 等於 2的元素。目標值 9-7 = 2,正好命中 Map 中的 key。
等同於 7 與 2 即是我們需要找尋的數組元素,返回他們的下標即可,2 對於的下標,hashMap.get(2)。7對應的下標爲 i.
3.測試 main 方法
public static void main(String[] args) {
int[] nums = new int[]{2,7,11,15};
int target =9;
int[] intArray = twoSum1(nums, target);
for (int i = 0; i < intArray.length; i++) {
System.out.println(intArray[i]);
}
}
寫在後面
任何時候的開始都不爲晚,種植一棵樹最好的時間是十年前,其次是現在。算法目前就是我內心的一座山。
直面它,不想着去繞過它,也不去刻意迴避它。踏踏實實做好自己的算法刷題小練習。一步一步,朝着這座算法山脈邁過去。
本文分享自微信公衆號 - 程序員小躍(runningdimple)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。