一、雨水量
题目描述
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入输出
输入输出格式
柱子数取1~12,每根柱子高度取0~10,分别输入柱子数和每根柱子高度,输出总蓄水量。
输出输出样例
输入1:
12
0 1 0 2 1 0 1 3 2 1 2 1
输出1:
6
int trap(int *height, int heightSize)
{
int h,i,j,v=0;
for(h=1;h<=10;h++)
{
for(i=j=0;i<heightSize&&j<heightSize;i=j) //i要反复变成j的柱子位
{
while(i<heightSize&&*(height+i)<h)
i++;
j = i+1; //i已经是柱子了
while(j<heightSize&&*(height+j)<h)
j++; //j也已经是柱子了
if(j>=heightSize) break;
else v += j-i-1;
}
}
return v;
}
给定一串字符,删除特定字符
二、买卖股票的最佳时机121
这题可双指针可动态规划
方法1:快慢指针:i通过循环移动,l通过条件到达i的位置,i还充当了最大值的任务
#include<stdlib.h>
int maxProfit(int* prices, int pricesSize){
if(pricesSize==1||pricesSize==0) return 0;
int l=0,mp=0;
for(int i=0;i<pricesSize;i++){
if(prices[i]<prices[l])
l = i;
mp = (prices[i]-prices[l])>mp?(prices[i]-prices[l]):mp;
}
return mp;
}
方法2:dp:
#include<stdlib.h>
int maxProfit(int* prices, int pricesSize){
if(pricesSize==1||pricesSize==0) return 0;
else{
int cnt = (prices[0]<prices[1])?(prices[1]-prices[0]):0;
int i,max = cnt;
for(i=1;i<pricesSize-1;i++){
cnt = prices[i+1] - prices[i] + ((cnt>0)?cnt:0) ;
if(max<cnt)
max = cnt;
}
return max;
}
}
三、第一个错误的版本287
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
//能循环就不递归
int l=1,r=n,mid;
while(l<r){
mid = l + ((r-l)>>1);
if(isBadVersion(mid)){
//在[l,r]
r = mid;
} else{
l = mid+1;
}
}
return l;
}