对于数组 A , 怎么求的Max((j - i) * [min (A[i] , A[j])]) , 其中 i , j < A.length - 1
这道题目, 暴力的话,很容易, O(n^2) , 可是采用头尾指针的方法可以在O(n)的时间内完成!
O(n) 的代码 及其简单,就是头尾指针,谁小谁移动,然后,求两个指针间的面积,再更新
最大面积即可。
但是,为什么?为什么这个方法能行了?
比如 : 数组A[3 , 7 , 4 , 8 , 5]
暴力的话,就是:
3 7 3
3 4 6
3 8 9
3 5 12
7 4 4
.....
8 5 5
观察上面的可以知道:
以A[0] = 3 为一条边的话,那么高度最大为3 , 所以,如果底边能最大 , 就能找到最大面积
所以,就可以采用尾指针从尾部遍历。
如果它比3小,那么就要在0 - A.length - 2中找 , 因为在这里面可能还存在面积更大的,而这个
面积最大的临界情况就是第一个>=3! 因为满足底最大! 那么接下来就不要比较A[1],A[2],A[3] 构成的大小,他们 一定比A[0]A[4]小!这样不就减少了没用的计算。直接进入A[1] = 7;
同理,以A[1] = 7 为高 , 查找第一个>=7的 , 但是,可能会想,已经过滤的尾部的元素
不会与7构成一个更大的元素吗?比如,如果上面数组在5后面有一个2 , 那么以A[0] = 3为边时,就已经
被过滤掉了,不会在于其他元素比较了?为什么这能行了?
可以这样考虑,它既然比3小,那么他就一定比7小(因为只有最小的那个元素在移动的啊),对吧!所以,
它与3为边时,底边还长1了,怎么可能与7再构成一个更大的面积!这又是在去除没用的计算。
所以,7 就只要关心,看能否与当前尾指针所指的元素及其前面的元素构成一个更大面积!
如此,一路遍历,直到头指针 >= 尾指针
总结:
关键的地方就在于头尾指针的使用,我觉得他们的作用就是一种标志!
标志,实际可能产生最大面积的范围
以上只是个人的一些粗陋的理解.......
代码:
public static int maxArea(int[] height) { int maxWater=0, left=0, right=height.length-1; //头尾指针 while(left<right) { maxWater = Math.max(maxWater,(right-left)*Math.min(height[left], height[right])); if(height[left]<height[right]) left++; else right--; } return maxWater; }
相关推荐
总的来说,解决"Container With Most Water"的问题,我们需要理解双指针策略,贪心算法,以及如何在代码中有效地计算和更新最大面积。这是一个典型的动态规划和优化问题,对于提升编程思维和算法能力有着重要的实践...
【LeetCode】Container With Most Water 是一道经典的计算机算法题,主要涉及到数组操作和动态规划的优化技巧。题目要求在给定的一组非负整数坐标中找到两条线,使得它们与x轴形成的容器能容纳最多的水。问题的核心...
【标题】"js代码-11. Container with Most Water" 是一个编程问题,源自LeetCode等在线编程... Container with Most Water”这个题目主要涉及滑动窗口、双指针技术和动态规划思想,是理解数组处理和优化算法的好实例。
c c语言_leetcode 0011_container_with_most_water.zip
java入门 java_leetcode题解之011_Container_With_Most_Water
js js_leetcode题解之11-container-with-most-water.js
c语言入门 C语言_leetcode题解之11-container-with-most-water.c
这是一个美丽的问题,展示了如何使用双指针方法获得更好的运行时 实现 1:O(n^2) class Solution { public int maxArea ( int [] height ) { if (height == null || height . length == 0 ) return 0 ; int ...
Chapter 2, DevOps with Container, helps you learn the fundamentals and container orchestration. With the trend of microservices, container has been a handy and essential tool for every DevOps because ...
11. Container With Most Water 13. Roman to Integer 15. 3Sum 16. 3Sum Closest 17. Letter Combinations of a Phone Number 18. 4Sum 19. Remove Nth Node From End of List 20. Valid Parentheses 21. Merge Two...
在"void 指针的妙用"这个主题中,我们主要探讨的是`void`指针在链表实现中的应用,特别是在阅读操作系统如uC/OS-II的源码时所体现的优势。 链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下...
deploy_container_with_gpu.sh
标题 "Docker Logging with a Tomcat Container with the Native Graylog Driver" 暗示了本文将探讨如何在Docker环境中使用Tomcat容器,并利用Graylog的原生驱动来收集和管理日志。Graylog是一个开源的日志管理和...
名称container_of - 获取指向包含结构成员的结构的指针概要#include "container_of.h" container_of(member_pointer, contains_struct, struct_member);描述container_of() 宏返回一个指向包含该结构体成员的结构体...
记录找工作期间搬运的题,全部使用Java实现,本人C++鶸 1 双指针 编号 题目 LeetCode 11 Container With Most Water LeetCode 19 Remove Nth Node From End of List LeetCode 42 Trapping Rain Water LeetCode 61 ...
本题是LeetCode中的第11题,名为“盛最多水的容器”(Container With Most Water),这是一道关于优化二维数组中两个元素乘积最大值的经典问题。 问题描述如下:给定一个包含n个非负整数的数组height,数组中元素的...
在这个特定的主题中,"C# vs2019 实现SplitContainer 上下左右 折叠 隐藏与显示"涉及到如何使用Visual Studio 2019来控制SplitContainer的四个Panel(顶部、底部、左侧和右侧)的折叠、隐藏和显示状态。以下是对这个...
此外,`RootForm`还维护了一个`IRootContainer`的指针,这个`RootContainer`用于管理所有的容器(`Container`)。 `RootContainer`的作用则更为底层,它不仅管理所有的`Container`,还通过`WidgetNode`来维护这些`...
SplitContainer控件是Windows Forms和WPF等GUI框架中常用的一种布局组件,它允许开发者在界面上创建可调整大小的面板区域。在这个特定的主题“SplitContainer带箭头收缩”中,我们关注的是如何通过添加箭头图形和...