inner: for (var j = i + 1, len = T.length; j < len; j++) {
if (T[j] > currValue) {
waitDay = j - i;
break inner;
}
}
result.push(waitDay)
}
}
return result;
};
执行结果是:
内存占用45.8M,超过100%用户?
执行时间924ms,竟然只超过了20.19%的用户。
考虑边界
考虑温度的边界,如果当前温度是100,那肯定就不用进第二层循环了。
var dailyTemperatures = function(T) {
var result = [];
for(var i = 0, len = T.length; i < len; 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 i++) {
var currValue = T[i];
if (currValue === 100) {
result.push(0);
} else if (i == len - 1) {
result.push(0);
} else {
var waitDay = 0;
inner: for (var j = i + 1, len = T.length; j < len; j++) {
if (T[j] > currValue) {
waitDay = j - i;
break inner;
}
}
result.push(waitDay)
}
}
return result;
};
new Array & fill
提交解法后,我看了一下第一名的解法,还是学到了一点东西。
主要有两个地方不太一样:
-
一个是使用
new Array
预先声明好数组空间,在大数组时性能表现更佳; -
第二个是使用了
Array.prototype.fill
预填充0
,所以也不需要判断是否需要进第二层循环。
var dailyTemperatures = function(T) {
const res = new Array(T.length).fill(0);
for (let i = 0; i < T.length; i++) {
for (let j = i + 1; j < T.length; j++) {
if (T[j] > T[i]) {
res[i] = j - i;
break;
}
}
}
return res;
};
特意对比了一下fill
和push
的执行时间,原来fill
的性能挺好的。
console.time(‘fill计时’);
var a = new Array(100).fill(0);
console.timeEnd(‘fill计时’);
// fill计时: 0.009033203125ms
console.time(‘push计时’);
a.push(0);
a.push(0);
a.push(0);
// 此处省略97行a.push(0);特意没有用for循环,毕竟循环也是要开销的。
console.timeEnd(‘push计时’);
// push计时: 0.02001953125ms