大家好,我叫亓官劼(qí guān jié ),在ImapBox中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客,亓官劼的博客2。 难度 中等 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 **说明:**你不能倾斜容器,且 n 的值至少为 2。 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 示例: 这题让我们求两个柱线间能存放的最大空间是多少,第一种解法当然就是暴力啦!我们遍历这个 完整的代码为: 提交这段代码的时候,我们发现在样例49/50的时候超时了,说明这次的数据量比较大,暴力竟然没法AC了!那我们就进一步的优化我们的算法吧! 这题的最优解应该就是双指针了,我们分别从两端开始移动,记录当前能够存水的值,并且更新 完整的题解代码为: 执行效率为: 大家好,我叫亓官劼(qí guān jié ),在ImapBox中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客,亓官劼的博客2。
LeetCode 每日一题 11. 盛最多水的容器
题目
输入:[1,8,6,2,5,4,8,3,7] 输出:49
题解一:暴力解法
height
数组,对每一个位置对我们计算从当前位置到后面的每个柱子间所能存水的数量,如果找出每个位置的最大值,如果比当前的最大值大,则更新,否则不更新。class Solution { public: int maxArea(vector<int>& height) { int ans = 0; int length = height.size(); for(int i = 0; i < length; i++){ int now = 0; for(int j = length-1; j >= i; j--){ int temp = min(height[i],height[j]) * (j - i); now = temp > now ? temp : now; } ans = now > ans ? now : ans; } return ans; } };
题解二:双指针
ans
,然后开始移动位置,我们移动高度较小的一段。即如果左面的高度小,则左面的位置右移;如果右面的高度小,则右面的位置左移。这样来更新我们的ans的值,最终取的最大值。class Solution { public: int maxArea(vector<int>& height) { int l = 0, r = height.size() - 1; int ans = 0; while (l < r) { int area = min(height[l], height[r]) * (r - l); ans = max(ans, area); if (height[l] <= height[r]) { ++l; } else { --r; } } return ans; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算