当前位置: 代码迷 >> 综合 >> leecode——contianer with most water(11)
  详细解决方案

leecode——contianer with most water(11)

热度:22   发布时间:2023-12-12 06:44:40.0

在这里插入图片描述
遇到这种题目不要慌张,根据要求,一步步的来思考。

from typing import Listdef max_area(height: List[int]) -> int:"""暴力遍历,时间复杂度是O(n^2),本质上也是双指针,two pointers:param height::return:"""max_a = 0for i in range(len(height)):for j in range(i + 1, len(height)):if height[i] > height[j]:a = (j - i) * height[j]else:a = (j - i) * height[i]if a > max_a:max_a = areturn max_adef max_area2(height: List[int]) -> int:"""这里有个技巧,首是间距最大个两个bar,肯定有一个大的或一个小的,如果相等的话移动哪个都一样了。最长间距的两个bar围成的面积是受最短的bar所限制,area = distance * min_bar下面要移动左边或右边的bar,假如移动较大的,则下一个的面积最大是 (distance -1)* min_bar,与上面的面积比较肯定是减小了。所以要移动较小的值的bar的index。这里用两个指针来记录围成矩形的两个边。:param height::return:"""max_a = 0idx_l = 0idx_r = len(height) - 1for _ in range(len(height)):height_l, height_r = height[idx_l], height[idx_r]if height_r > height_l:area = (idx_r - idx_l) * height_lidx_l += 1else:area = (idx_r - idx_l) * height_ridx_r -= 1if area > max_a:max_a = areareturn max_aif __name__ == '__main__':hs = [1, 8, 6, 2, 5, 4, 8, 3, 7]print(max_area2(hs))