@TOC力扣
力扣11盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
题目分析
求一个最大区间使得区间内可以盛最多的水
解题思路
如果利用双重循环求解会超出时间限制,所以需要用到双指针,分别从数组的开头末尾开始遍历,盛水空间为快慢指针距离*短板(两个指针中小的数值),不断缩小距离,更新最大值,注意在缩小距离时要移动短板,移动长板有可能遗失最大值
代码实现
class Solution {
public:
int maxArea(vector<int>& height) {
int res=0;
for(int i=0,j=height.size()-1;i<j;){
if(height[j]>height[i]){
res=max(res,(j-i)*height[i++]);
}else{
res=max(res,(j-i)*height[j--]);
}
}
return res;
}
};
力扣53最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
题目分析
找到连续的最大的子数组和
解题思路
for循环遍历数组,不断更新最大值,当和为负数时将和重置为0
代码分析
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int a=0,sum=0,b=INT32_MIN;
for(int i=0;i<nums.size();i++)
{
a+=nums[i];
b=a>b?a:b;
if(a<0)a=0;
}
return b;
}
};