思路

暴力循环解决

  • 对数组各个元素进行第一遍遍历,在此之中以该元素为基准该元素后面的所有元素进行遍历,进行两者最短高度 * (后面元素下标 - 该元素下标)运算,遍历完成即可得到上述值的最大值result。
  • 该元素后面的所有元素进行遍历:这个循环是指定开始索引的位置往后进行的遍历,使用传统for循环或是for in循环

这种解法会超时,写的时候我就感觉到了数组的双循环八成是超时,即便我是第二个循环不找全部元素,但还是超时n^2逃不掉11. 盛最多水的容器🔖数组🔖双指针 - 图1

  1. function maxArea(height: number[]): number {
  2. let result: number = 0
  3. height.forEach((data: number, index: number) => {
  4. if (index !== height.length - 1) {
  5. for (let i: number = index + 1; i < height.length; i++) {
  6. let result_temp = Math.min(height[i], data) * (i - index)
  7. result > result_temp ? (result = result) : (result = result_temp)
  8. }
  9. }
  10. })
  11. return result

image.png

两端双指针移动解决

  • 探究解决办法的规律来解决问题,利用双指针在首末端往中间靠,每次移动arr[指针]小的,然后在此次与result相比较。
  • 这样只需要遍历一遍即可,时间复杂度为n
  1. function maxArea(height: number[]): number {
  2. let head: number = 0
  3. let back: number = height.length - 1
  4. const result_fun = (head: number, back: number): number => {
  5. return Math.min(height[head], height[back]) * (back - head)
  6. }
  7. let result = result_fun(head, back)
  8. while (head !== back) {
  9. height[head] < height[back] ? head++ : back--
  10. if(result <= result_fun(head, back) ) result = result_fun(head, back)
  11. }
  12. return result
  13. }

image.png