效率循环数组
通常我们在匹配数组或者集合的时候经常会无脑的去用多层for循环遍历。【别点我,我就是一个菜鸟】。偶然一次发现,当需要处理遍历匹配两个数组或者集合的时候利用map的效率会比for循环高出几十倍。在这里mark一下。
参照力扣题库第一题。给定一个数组,在里面找出两个数字加起来正好等于目标值。
暴力的写法:
class Solution {
public int[] twoSum(int[] nums, int target) {
int [] str = new int[2];
// 比target大的值可以忽略掉
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums.length;j++){
if(i!=j&&nums[i]==target-nums[j]){
str[0]=i;
str[1]=j;
return str;
}
}
}
return str;
}
}
使用Map之后的写法
class Solution {
public int[] twoSum(int[] nums, int target){
Map<Integer,Integer> colle = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(colle.containsKey(target-nums[i])){
return new int[]{colle.get(target-nums[i]),i};
}else{
colle.put(nums[i],i);
}
}
return null;
}
}
两种写法性能对比:
耗时 | 内存消耗 |
---|---|
83 ms | 37.2 MB |
3 ms | 37.9 MB |
不管从代码可读性上还是性能上,使用HashMap都要远远优于循环遍历。在此mark一下。
顺便推荐一个很好用的类:com.google.common.collect.Maps
这个类下面有一个方法uniqueIndex可以快速便捷的将一个集合转换成HashMap的键值对形式,非常好用!
Map<Integer, String> maps = new HashMap<>(Maps.uniqueIndex(neededGoodsArray, new Function<String, Integer>() {
@Nonnull
@Override
public Integer apply(String s) {
return Integer.parseInt(s);
}
}));
需要了解的自行百度哈。