LeetCode:11. Container With Most Water(求能装多少水问题)

野性酷女 2022-04-04 07:50 219阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k

文章目录:

题目描述:

java实现方法1:(暴力算法)brute force

python实现方式1:

java实现方法2:(双指针的方式)

python实现方式2:

github地址:https://github.com/zhangyu345293721/leetcode


题目描述:

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

format_png

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

实例:

  1. 输入: [1,8,6,2,5,4,8,3,7]
  2. 输出: 49

java实现方法1:

  1. /**
  2. * 暴力算法(brute force)
  3. *
  4. * @param height 长度数组
  5. * @return 面积
  6. */
  7. private int maxArea(int[] height) {
  8. if (height == null || height.length < 2) {
  9. return 0;
  10. }
  11. int maxArea = 0;
  12. for (int i = 0; i < height.length - 1; i++) {
  13. for (int j = i + 1; j < height.length; j++) {
  14. int high = Math.min(height[i], height[j]);
  15. maxArea = Math.max(maxArea, high * (j - i));
  16. }
  17. }
  18. return maxArea;
  19. }

时间复杂度:O(n^2)

空间复杂度:O(1)


python实现方式1:

  1. def max_area(heights: List[int]) -> int:
  2. '''
  3. 求最大面积
  4. Args:
  5. heights:长度数组
  6. Returns:
  7. 最大面积
  8. '''
  9. if len(heights) < 2:
  10. return 0
  11. max_area = 0
  12. for i in range(len(heights) - 1):
  13. for j in range(i, len(heights)):
  14. high = min(heights[i], heights[j])
  15. wide = abs(i - j)
  16. area = high * wide
  17. if area > max_area:
  18. max_area = area
  19. return max_area

时间复杂度:O(n^2)

空间复杂度:O(1)


java实现方法2:(双指针的方式)

  1. /**
  2. * 快速排序的基本思想
  3. *
  4. * @param height 长度数组
  5. * @return 面积
  6. */
  7. private static int maxArea2(int[] height) {
  8. int maxArea = 0;
  9. int i = 0;
  10. int j = height.length - 1;
  11. while (i < j) {
  12. int area = Math.min(height[i], height[j]) * (j - i);
  13. maxArea = Math.max(maxArea, area);
  14. if (height[i] < height[j]) {
  15. i++;
  16. } else {
  17. j--;
  18. }
  19. }
  20. return maxArea;
  21. }

时间复杂度:O(n)

空间复杂度:O(1)


python实现方式2:

  1. def max_area2(heights: List[int]) -> int:
  2. '''
  3. 求最大面积
  4. Args:
  5. heights:长度数组
  6. Returns:
  7. 最大面积
  8. '''
  9. if len(heights) < 2:
  10. return 0
  11. max_area, i, j = 0, 0, len(heights) - 1
  12. while i < j:
  13. area = min(heights[i], heights[j]) * abs(i - j)
  14. max_area = max(area, max_area)
  15. if heights[i] < heights[j]:
  16. i += 1
  17. else:
  18. j -= 1
  19. return max_area

时间复杂度:O(n)

空间复杂度:O(1)


github地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,219人围观)

还没有评论,来说两句吧...

相关阅读