先巩固一下关于js原型的内容:
1.原型链通过_proto_层层向上;
2.prototype对象中存放能够被继承的属性。
↑一个介绍地详细的文章
instanceof运算符:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
function instanceofF(A, B) {
var L = A.__proto__;
var R = B.prototype;
if (L === R) {
//A的内部属性__proto__指向B的原型对象
return true;
}
return false;
}
知识点整理:
JavaScript 数组(Array)是有序数据的集合,数组中的每个成员被称为元素(Element),每个元素的名称(键)被称为数组下标(Index)。数组的长度是弹性的、可读写的。
数组常用方法:JavaScript中数组常用方法汇总(ES5)
三点运算符:【ES6】扩展运算符(...) 最常用的方法!!_扩展运算符 覆盖_Milk595的博客-CSDN博客
题目:495. 提莫攻击
我的思路:一开始,想通过打标签的方法统计每秒的中毒状态,但是这样需要O(2n)的时间,对于超大数据量的样本超时了。
因此,应该控制时间复杂度在单次扫描的范围内O(n)。
这里需要重点考虑,上一次中毒未结束时,下一次中毒状态已经开始的情况。
第一种解法:(前面完整+后面部分)
var findPoisonedDuration = function(timeSeries, duration) {
let ans = 0;
let expired = 0;
for (let i = 0; i < timeSeries.length; ++i) {
if (timeSeries[i] >= expired) {
ans += duration;
} else {
ans += timeSeries[i] + duration - expired;
}
expired = timeSeries[i] + duration;
}
return ans;
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/teemo-attacking/solution/ti-mo-gong-ji-by-leetcode-solution-6p4k/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第二种解法:(前面部分+后面完整)
var findPoisonedDuration = function(timeSeries, duration) {
var sum=0;
for (i=0; i<timeSeries.length-1; i++){
j=timeSeries[i];
k=timeSeries[i+1];
sum += Math.min((k-j),duration);
}
sum += duration;
return sum;
};
题目:安全验证 - 知乎
方法一:排序,找到不重复的第三个最大值。
var thirdMax = function(nums) {
nums.sort((a, b) => b - a);
var diff=1;
var thrid=0;
for( i=1; i<nums.length; i++){
if(nums[i]!=nums[i-1]) diff++;
if(diff==3) {
return nums[i];
}
}
return nums[0];
};
方法二:去重,再排序:
var thirdMax = function(nums) {
var set = new Set(nums);
if (set.size < 3) {
return Math.max(...[...set]);
} else {
var li = [...set];
li.sort((a, b) => b-a);
return li[2];
}
};
作者:doublez0108
链接:https://leetcode.cn/problems/third-maximum-number/solution/lai-zi-bei-da-suan-fa-ke-de-leetcodeti-j-sekf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法三:利用有序集合的特性,遍历数组每次插入数后如果长度大于3就移除集合里的最小值。
方法四:用a,b,c三个值维护firstMax,secondMax,thirdMax。初始化-Number.MAX_VALUE或者NULL。
没有复杂的算法,但是需要思考出这个结论:
复杂度分析
时间复杂度:logO(NlogN),其中 N 为数组长度。排序需要 logO(NlogN) 的时间。
空间复杂度:logO(logN),主要为排序的空间开销。
优化:我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。
var maximumProduct = function(nums) {
// 最小的和第二小的
let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
// 最大的、第二大的和第三大的
let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;
for (const x of nums) {
if (x < min1) {
min2 = min1;
min1 = x;
} else if (x < min2) {
min2 = x;
}
if (x > max1) {
max3 = max2;
max2 = max1;
max1 = x;
} else if (x > max2) {
max3 = max2;
max2 = x;
} else if (x > max3) {
max3 = x;
}
}
return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/maximum-product-of-three-numbers/solution/san-ge-shu-de-zui-da-cheng-ji-by-leetcod-t9sb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间复杂度:O(N),其中 N 为数组长度。我们仅需遍历数组一次。
空间复杂度:O(1)。