开启自己的LeetCode之旅…
在本科期间的时候就听过这个网站,但是就是一直没有付出自己的实践(本科实在太滑水了,自己现在回想起来真的觉得有点不堪入目,自己已经准备开始读研了,因此想好好“做一次人”),此一系列博客留给自己复习用,所以现在是一名小菜鸡,希望各路大神指点,并且有好的学习方法可以在评论区告诉我谢谢!!!
下面开始我今天的主题了啦:两数之和
该题的一些收获:
- Map和HashMap的用法
Map<Integer,Integer> map = new HashMap<>();
map.put(key0,key1);
map.containsKey(key); //返回值true/false
map.get(key0); //返回值value/null - 返回一个数组“[0,1]”
1) 要么自己定义一个数组
int[] res = new int[2];
return res;
2) 直接在返回值这么写
return new int[] {key0,key1}; - 防御式编程和契约式编程
throw new IllegalArgumentException(" "); - 想法idea
我初始的想法是暴力解法中nums[i]+nums[j] ==target; 但是这样的想法导致你后面无法进行优化。
complement ==target - nums-[i]; 这是能够进行优化的前提!!!
该题的解法:
- 官方解答
- 自己看到一个惊艳的解法(虽然和官方第三种解答有点像,但是省略的几行代码很经典)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++) {
if (map.get(target-nums[i]) != null) {
return new int[] {map.get(target-nums[i]), i};
}
map.put(nums[i], i);
}
return new int[]{0, 0};
}
}
这里if (map.get(target-nums[i]) != null)非常耐人寻味:
为什么不写成if (map.get(target-nums[i]) != i)呢?
(1)Map对相同的的键进行put操作时,后面的put操作会覆盖前面的put操作。自己可以去编译器试一试。
(2)对当前i的nums数组值判断时,当前的nums[i]并不在map中。