关于算法题的做法,自己也很少去看,也很少去做,所以这里自己也是一位算法做题的"萌新",还记得大学时自己买过一本关于算法题的书,有的时候还会翻翻这本书,但是这本书留在了郑州,是的,那个临近毕业的时候自己,不需要的书籍都卖了,唯独自己喜欢的几本书没有卖,那本算法书就没有卖,因为它承载了自己大学里美好的一段时光,至少每每看到那本书自己还会去回忆一下。
关于为什么自己现在开始会去做算法题了,其实就是刚开始毕业的时候,由于找工作的原因都是面向企业级应用开发,所以自然工作比较重要,所以算法题自然放到了一边,无暇顾及,后面随着工作的深入,也基本上用不到算法,但是会用到java原有的集合,这个时候自己也分析了一些集合的源码分析文章,或许你读过我的文章就知道分析源码的文章自己基本上分析完了,所以这里就想着自己看看能不能做些算法题呢,至少自己不反感它,因为目前自己不会涉及spring这样优秀框架源码的阅读,因为它本身的特性自己也是在前段时间刚分析完,觉得还是需要沉淀一下,况且自己工作中也用不到必须要分析spring的源码的场景。
这里就开始了自己公众号算法题的内容输出了,其实前面已经写了几十道了,见前面文章的github地址进行获取,其实各个网站都有自己的提交记录,这里也是将自己编写的代码在文章中进行说明一下,这样以后可以看自己公众号里面的内容就可以了。
这里说明一下吧,由于题目的介绍自己就不在文章中进行说明了,这里以截图的方式进行说明,给与题目的连接就可以了
两数之和:https://leetcode-cn.com/problems/two-sum/
这样的方式还是比较友好,内容还是比较清晰的,以后就会以这样的风格来进行编写了。
这里提供两种解法,一种是暴力解法,另外一种就是基于HashMap做的,暴力解法也可以做,主要是时间复杂度高O(n^2),采用了HashMap主要是基于空间换时间的角度出发的,这里就不过多说明什么了,看下示例程序就可以了
package com.wpw.niuketest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class TwoSumTest {
public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int target = 9;
// int[] result = twoSum(nums, target);
int[] result = twoSumWithMap(nums, target);
Arrays.stream(result).forEach(x -> System.out.print(x + "\t"));
}
public static int[] twoSum(int[] nums, int target) {
int length = nums.length;
final int arrayCount = 2;
int[] result = new int[arrayCount];
for (int i = 0; i < length; i++) {
for (int j = 1; j < length - 1; j++) {
if (nums[i] + nums[j] == target) {
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
public static int[] twoSumWithMap(int[] nums, int target) {
int length = nums.length;
final int arrayCapacity = 2;
int[] result = new int[arrayCapacity];
Map<Integer, Integer> hashMap = new HashMap<>(16);
for (int i = 0; i < length; i++) {
if (hashMap.containsKey(target - nums[i])) {
result[0] = hashMap.get(target - nums[i]);
result[1] = i;
return result;
}
hashMap.put(nums[i], i);
}
return result;
}
}
这里说明一点,由于内存空间还是比较有用的,也就是在返回的数组大小时,指定大小为2,这样可以减少内存空间的分配,到这里就结束了。下面由于觉得还是HashMap这样的用法比较省时间,所以这里就提交了方法二的代码。
快乐工作,懂得生活。
网友评论