题目来源: 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
};