算法撸一遍,从简单的开始。
做leetcode题目的时候,经常百度答案,但感觉大多不是我想要的,很多我不能理解。现在也做了一些算法题,哪些并不是很深奥,但需要一些技巧,简单的算法题更多的是经验值。这里,开启算法题篇章。给自己记忆,希望不要误人子弟。
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]解题
这是LeetCode算法题库的第一个算法题,比较简单。题目读一遍,然后整理一下题目的意思。
理解:
1:在一个整数数组中,必定有两个数相加等于target。
2:需要记录这两个数的下标,合成数组返回
为什么暴力破解不佳:
在大多数没有做过算法题的思维下,第一选择方案是暴力破解,但这个时间复杂度是成指数增长的。如果这个数组是一千个,两个for循环进行计算,也就是要计算一千的平方。这样太消耗时间和内存。
HashMap解题:
再来看一下理解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