贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择,就能得到问题的答案。贪心算法需要充分挖掘题目中条件,没有固定的模式,解决有贪心算法需要一定的直觉和经验。
贪心算法不是对所有问题都能得到整体最优解。能使用贪心算法解决的问题具有「贪心选择性质」。「贪心选择性质」严格意义上需要数学证明。能使用贪心算法解决的问题必须具备「无后效性」,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
从数组两边遍历,给定两个指针,i指向头,初始值为0,j指向尾,初始值为n-1;
以左指针小于右指针为条件,如果左边的高度小于右边的高度,最小高度就为右边柱子,面积大小就为(j-i+1)*min;将最大值赋予size
i 0 1 1 1 1 1 1 1 1
j 8 8 7 6 5 4 3 2 1
#include <stdio.h>
int maxArea(int* height, int heightSize){
int max=0,size=0,min=0;//从数组两边遍历,设置两个指针i指向头,j指向尾
int i=0,j=heightSize-1;
while(i<j){//遍历
if(height[i]<height[j])//面积是取最小的height乘长度,并且将短的淘汰留下较长的和后面的继续比较
min=height[i++];
else
min=height[j--];
size=(j-i+1)*min;//计算面积
if(max<size)//面积取遍历的最大值
max=size;
}
return max;
}
int main()
{
int height[]={1,8,6,2,5,4,8,3,7};
int max;
max= maxArea(height,9);
printf("%d",max);
return 0;
}