Leetcode题库 11.盛水最多的容器(双指针法 C实现)
文章目录
- 解析
- 思路
- 原理
- 代码
- 写法1
- 写法2
解析
p_0:左”指针”
p_1:右”指针”
Area:当前双”指针”代表面积大小
ret:记录面积最大值
思路
p_0指向数组头部
p_1指向数组尾部
Area为当前双”指针”代表的面积
比较Area与ret大小
若height[p_0]>=height[p_1]
——”指针”p_0+1, ”指针”p_1所代表的面积一定小于Area
——”指针”p_0, ”指针”p_1-1所代表的面积可能大于Area
——要求最大面积, 于是p_1自减1
height[p_0]<height[p_1]
——同理有p_0自加1
原理
如何保证被剔除的p_1/p_0不会与除p_0/p_1外的”指针”形成更大的面积
证明:
若height[p_0]>=height[p_1], 则剔出p_1
”指针”p_0, ”指针”p_1所代表的面积=(p_1-p_0)*height[p_1]
存在i>0, ”指针”p_0+i, 与”指针”p_1形成的面积=(p_1-(p_0+i))*min(height[p_0+i], height[p_1])
比较双方第一项(p_1-p_0) ,(p_1-(p_0+i)) , 得到前者>后者
比较双方第二项height[p_1], min(height[p_0+i], height[p_1]) , 得到前者>=后者
于是有
被剔除的p_1不可能与p_0+i形成更大的面积
height[p_0]<height[p_1], 剔出p_0同理
代码
写法1
int maxArea(int* height, int heightSize){int p_0=0,p_1=heightSize-1,Area,ret=0;while(p_0!=p_1){if(height[p_0]>=height[p_1]){Area=(p_1-p_0)*height[p_1];p_1--;}else{Area=(p_1-p_0)*height[p_0];p_0++;}if(ret<=Area)ret=Area;}return ret;
}
写法2
int maxArea(int* height, int heightSize){int *p_0=height,*p_1=p_0+(heightSize-1),Area,ret=0;while(p_0!=p_1){if(*p_0>=*p_1){Area=(p_1-p_0)*(*p_1);p_1--;}else{Area=(p_1-p_0)*(*p_0);p_0++;}if(ret<=Area)ret=Area;}return ret;
}
Leetcode题库 11.盛水最多的容器(双指针法 C实现)相关推荐
- Leecode刷题热题HOT100(11)——盛水最多的容器
- LeetCode 11盛水最多的容器12整数转罗马数字
目录 盛水最多的容器 题目描述 分析 整数转罗马数字 题目描述: 分析 结语 盛水最多的容器 公众号:bigsai,回复进群加入打卡,回复bigsai获取3GB的pdf资源.点赞再看,养成习惯! 题目 ...
- LeetCode 11盛水最多的容器
力扣 解释:给定数组nums,求Max( min(nums[i],nums[j])*(j-i) ), 0<=i<j<nums.size() 目录 双指针 简单证明: 小技巧 1.对撞 ...
- 力扣:11盛水最多的容器
class Solution:def maxArea(self, height: List[int]) -> int:i, j, res = 0, len(height) - 1, 0while ...
- 力扣--盛水最多的容器
题目: 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条 ...
- Container with most water(盛水最多的容器)
Container with most water(盛水最多的容器) 简单的证明 如图 题目: 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n ...
- Leetcode:11.container-with-most-water(盛水最多的容器)
一开始直接想用暴力法加剪枝擦边通过的,没想到还是超时了: 谁知道最后输入从1-15000一共15000个数据,吓坏! 题解中得知双指针实现O(n),真的学到了,羡慕这些大佬的智商: 借鉴大佬题解:对O ...
- 十一、盛水最多的容器
题目:来源于LeetCode 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) . 找出其中的两条线,使得它们与 ...
- LeetCode题库11:盛最多水的容器——JavaScript解答
题目描述: 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的 ...
最新文章
- Android webview基础知识
- TCP快速重传为什么是三次冗余ack,这个三次是怎么定下来的?
- 解决eclipse报PermGen space内存溢出异常的问题
- C++ STL priority_queue的正确使用方法
- 如何安装uclient_uclient软件
- 淮北农村生活污水处理设备——十四五生态环境保护规划
- Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)
- conda 安装完了之后安装torch总是失败
- Linux简介和各发行版介绍
- Qt在设计ui界面时,在控件中输入中文,会自动变成英文字母,解决方案
- 键盘的某些键坏了咋办(如delete键等)
- NATO(北大西洋公约组织)采用ADOBE FLEX作为作战支持系统
- CAD制图初学入门技巧:如何批量生成CAD填充边界?
- python微信群发_更新新年祝福群发!小白转战Python微信定时发送消息给群或是个人!...
- 西山居工作室十周年回顾——产品篇
- 宝塔Linux面板——用正确的入口登录面板
- 【WSL2】配置连接 USB 设备并使用主机的 USB 摄像头
- 把话说清楚的万能公式
- xray和rad或burp联动
- 2022年4月16日,第9天