TwoSum 问题
2018-05-23 本文已影响11人
shane51
https://leetcode.com/problems/two-sum/description/
思路:
- 计算差值
- 找出差值index
数据结构 与 复杂度
- Array 时间复杂度n的2次方,空间1
- Map 时间复杂度n,空间n
遇到的问题
- nums = [3, 2, 4] ; targe = 6
每个元素只能使用一次,用数组做双重循环不会有问题,因为j可以从1开始,但是对于Map就会有问题,必须保证map[diff] != i 。
考虑边界情况
- nums = [3,3]; target = 6
计算时,先计找当前map里有没有,没有找下一个。避免当值都一样时,找到永远index都是0.
考虑计算顺序
- 使用双重循环时
注意j的初始值为i+1,因为组合过的不用再判断。 - map的两种解法:
- 用两个循环,先把所有的结果都放到map里,对比nums array和map,如果有值相同,则会只保留最有一个,避免了问题2种的情况
- 当值用一个循环时,查找map[diff]时,因为num[i]还没有存在buff_diff 中,所以避免了自己被再次选中的情况而被问题1的条件直接过滤掉。
总结
是否应该先考虑testcase,在写算法合适?
另外, 用两个循环从可读性上,来讲更加好。
java 语言上犯过的错误
- java 创建数组,需要new,且需要给出数组长度,或者给出具体的数组内容
int[] myArray = new int[2]
int[] myArray = new int[]{1,2}
int[] myArray = {1,2}
-
抛异常的方法
throw new IllegalArgumentException("nums is incorrect")
-
java语句是需要
;
闭合 -
任何情况下创建变量一定要声明类型,特别是for循环里,还要赋初值
for(int i=0; i<10;i++) {
//todo
}
- java 泛型声明参数化类型时必须时类型的类名,如一个key/value都是int的map的声明是:
Map<Integer, Integer> map = new HashMap<>()
而不是
Map<int, int> map = new HashMap<>()