485. 最大连续 1 的个数
思路
双指针遍历找到当前连续的长度,并保存最大值
代码
/**
* @param {number[]} nums
* @return {number}
*/
var findMaxConsecutiveOnes = function(nums) {
let l = 0, r = 0, ret = 0;
const len = nums.length
while(r < len) {
if (!nums[r]) {
l = r + 1;
r++;
} else {
r++;
ret = Math.max(ret, r - l)
}
}
return ret;
};
复杂度分析
时间复杂度 #card=math&code=O%28N%29)
空间复杂度 #card=math&code=O%281%29)
495. 提莫攻击
思路
双指针,每次改变当前的持续时间范围,找到最新可持续时间
代码
/**
* @param {number[]} timeSeries
* @param {number} duration
* @return {number}
*/
var findPoisonedDuration = function(timeSeries, duration) {
let start = 0, end = 0, count = 0;
for(let i = 0; i < timeSeries.length; i ++) {
let cur = timeSeries[i], curEnd = cur + duration;
if (cur > end) {
start = cur;
end = curEnd;
count += duration
} else {
start = end;
end = curEnd;
count += end - start;
}
}
return count;
};
复杂度分析
时间复杂度 #card=math&code=O%28N%29)
空间复杂度 #card=math&code=O%281%29)
414. 第三大的数
思路
遍历比大小
代码
/**
* @param {number[]} nums
* @return {number}
*/
var thirdMax = function(nums) {
let min = Number.MIN_SAFE_INTEGER, mid = Number.MIN_SAFE_INTEGER, max = Number.MIN_SAFE_INTEGER, len = nums.length
for(let i = 0; i < len; i ++) {
let cur = nums[i];
if (cur < min) continue;
if (cur > max) {
min = mid;
mid = max;
max = cur;
} else if (cur > mid && cur < max) {
min = mid;
mid = cur;
} else if (cur > min && cur < mid) {
min = cur;
}
}
return (len >= 3 && min != Number.MIN_SAFE_INTEGER) ? min : max;
};
复杂度分析
时间复杂度 #card=math&code=O%28N%29)
空间复杂度 #card=math&code=O%281%29)
628. 三个数的最大乘积
思路
先排序。然后考虑有负数和都为正的情况。
代码
/**
* @param {number[]} nums
* @return {number}
*/
var maximumProduct = function(nums) {
nums = nums.sort((a, b) => a - b)
let len = nums.length
return Math.max(nums[0] * nums[1] * nums[len-1], nums[len-3]*nums[len-2]*nums[len-1])
};
复杂度分析
时间复杂度 #card=math&code=O%28nlogN%29)
空间复杂度 #card=math&code=O%281%29)