双层循环遍历 减少时间复杂度
双层for循环,时间复杂度O(n2),空间复杂度O(1),往往会带来很大的时间开销,尤其是当数组长度比较大时,很容易造成程序卡顿。接下来的方法可以用空间复杂度换时间复杂度:
哈希表
哈希表为无序Map,插入、查找、删除的时间复杂度均为O(1)
例如:
给定一个整数数组 nums 和一个目标值 target,找出和为目标值的那 两个 整数,并返回他们的数组下标
//传统:双层for循环遍历
for(i=0;i<nums.length-1;i++){
for(k=i+1;k<nums.length;k++){
if((nums[i]+nums[k])==target) return [i,k];
}
}
//HashMap
let hashMap = {};
for(i=0;i<nums.length;i++){
if(hashMap.hasOwnProperty(target - nums[i])){ //如果map中有符合条件的 输出
return [hashMap[target - nums[i]],i];
}
else {
hashMap[nums[i]]=i;
}
}
throw new Error('Whoops!'); //循环完成,抛出异常
算法 | 运行时间 | 内存消耗 |
---|---|---|
HashMap | 944ms | 52.2MB |
另,对于javascript来说,还有一种更省时间的方式:数组存储。
let list = [];
for(i=0; i<nums.length; i++){
let index = target - nums[i];
if(list[index] != null){
return [list[index],i];
}else{
list[nums[i]] = i;
}
}
算法 | 运行时间 | 内存消耗 |
---|---|---|
List | 148ms | 46.8MB |