【双指针]-C语言

本文探讨了两个经典的算法问题:一是如何计算给定柱状图的蓄水量;二是如何找到买卖股票的最佳时机以获得最大利润。对于蓄水量计算问题,提供了一种逐层累加的方法;对于股票交易问题,则提供了基于动态规划和双指针两种解决方案。
摘要由CSDN通过智能技术生成

一、雨水量

题目描述

给定 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;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值