#11 乘最多水的容器

暴力循环算法

这道题思路简单,两重循环加遍历即可,但是这么搞效率着实低…

class Solution {
public:
 int maxArea(vector<int>& height) {
  	int n = height.size();
  	int temp = 0, max = 0,min;
  	for (int i = 0; i < n - 1; i++) {
   		for (int j = i + 1; j < n; i++) {
    			min = height[i] < height[j] ? height[i] : height[j];
    			temp = (j - i) * min * min;
    			max = max < temp ? temp : max;
   }
  }
  return max;
}
};

复杂度分析
时间复杂度:O(n ^ 2),计算所有 n(n−1)​ 种高度组合的面积。
空间复杂度:O(1),使用恒定的额外空间。

嗯这个效率过于感人

所以去学习点比较好的算法。

双指针算法

从左右两边开始逐步计算。两个数取低的再乘以横坐标的差。由于盛水取决于低的板子,如果高的板子移动,对于增大装水量毫无意义,而低的板子移动可能变成一个高的板子。所以就可以利用这个思路只需要访问height一遍就可以。

class Solution {
public:
 int maxArea(vector<int>& height) {
  	int n = height.size();
  	int temp = 0, max = 0;
  	int m = n - 1,i=1;
  	while (m > i) {
   	temp = min(height[i], height[m]) * (m - i);
   	height[m] > height[i] ? ++i : ++m;
   	max = max < temp ? temp : max;
  }
  	return max;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值