算法撸一遍,从简单的开始。算法
作leetcode题目的时候,常常百度答案,但感受大多不是我想要的,不少我不能理解。如今也作了一些算法题,哪些并非很深奥,但须要一些技巧,简单的算法题更多的是经验值。这里,开启算法题篇章。给本身记忆,但愿不要误人子弟。数组
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。bash
你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素。ui
示例:spa
给定 nums = [2, 7, 11, 15], target = 9
由于 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]复制代码
这是LeetCode算法题库的第一个算法题,比较简单。题目读一遍,而后整理一下题目的意思。3d
1:在一个整数数组中,一定有两个数相加等于target。code
2:须要记录这两个数的下标,合成数组返回cdn
在大多数没有作过算法题的思惟下,第一选择方案是暴力破解,但这个时间复杂度是成指数增加的。若是这个数组是一千个,两个for循环进行计算,也就是要计算一千的平方。这样太消耗时间和内存。blog
再来看一下理解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
复制代码