大家好,我是你们的跃哥。平时跃哥在和大家沟通交流的时候,时不时地会被问到,跃哥,算法在工作中到底用不用得到啊?算法真的很重要么?
这。。。平时的工作中,算法不一定能用到;但是如果你能在工作中用到算法,那么你的工作就会变得更有意义,甚至是会让你的程序有很大的提升。
今天跃哥就推荐大家看看,一个小伙伴写的真实感想。
写在前面
进入编程行业四年有余了,如果你要是问我,对什么领域的知识最陌生呢。首先排在我脑海里面第一位的就是算法了。
算法其实我内心一直有一种排斥感,我也仔细分析了这个排斥感的原因,最主要的还是脑海中对于这一块知识的空缺。
还有一个原因就是工作中,用到的地方实在是不多。毕竟,如果工作中天天在用的东西,你不想学会都是挺难得一件事情。
但是,想要往编程的领域进阶,算法就是我心中必须迈过去的一座山。不管它是存在着多少困难。
问题就在那里,目标就在那里,机会也在那里。不逃避,不害怕。慢慢刷题。需要一道一道的去刷去学习。
算法的学习依旧是有套路可以追寻的,依旧是可以通过大量反复练习掌握的。
算法准备
去年的时候,陆陆续续购买了两本算法相关的书籍,一本是《我的第一本算法书》、另外一本是《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]);
}
}
写在后面
任何时候的开始都不为晚,种植一棵树最好的时间是十年前,其次是现在。算法目前就是我内心的一座山。
直面它,不想着去绕过它,也不去刻意回避它。踏踏实实做好自己的算法刷题小练习。一步一步,朝着这座算法山脉迈过去。