题目来源: LeetCode 75 30 天 JavaScript 挑战
思路
双指针,一个从数组开头,一个从数组结尾分布计算最大值
代码
ts
function maxArea(height: number[]): number {
let max = 0
let p1 = 0
let p2 = height.length - 1
while(p1 < p2) {
if (height[p1] < height[p2]) {
max = Math.max(max, (p2 - p1) * height[p1])
p1++
} else {
max = Math.max(max, (p2 - p1) * height[p2])
p2--
}
}
return max
};
思路
首先将数组排序方便计算,使用双指针,前后扫描对比 k,移动指针
代码
ts
function maxOperations(nums: number[], k: number): number {
let result = 0
// 排序,方便计算
nums = nums.sort((a, b) => a - b)
// 左右指针
let start = 0
let end = nums.length - 1
while(start < end) {
let sum = nums[start] + nums[end]
if (sum === k) {
result++
start++
end--
} else if (k > sum) {
start++
} else {
end--
}
}
return result
};
思路
使用滑动窗口找出最大子数组的和,子数组的和最大那么子数组的平均数也是最大。
代码
ts
function findMaxAverage(nums: number[], k: number): number {
let max = 0
// 计算前 k 项子数组和
for(let i = 0; i < k; i++) {
max += nums[i]
}
let maxSum = max
for (let i = k; i < nums.length; i++) {
// 从头开始计算最大子数组的和
max = max - nums[i - k] + nums[i]
maxSum = Math.max(maxSum, max)
}
return maxSum / k
};
代码
ts
function map(arr: number[], fn: (n: number, i: number) => number): number[] {
let res = []
for(let i = 0; i < arr.length; i++) {
res.push(fn(arr[i], i))
}
return res
};