leetcode第42题接雨水--双指针

 写写思路:存水一定是在两个峰中间,且两个最高峰之间存的水位一定是最高!

那我们就把峰高和峰位置记录下来成为list_top,

从最高到低遍历list_top:

        如果当前峰在已经处理的峰之外(idx_top<l or idx>r),在当前峰和边界之间存水操作,直到遍历完所有的峰

        否则不处理继续处理下一个峰。

        所以需要用到双指针来确定已经处理过的峰,初始l=r=idx_top(-1)(最高峰)

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        先低再高能存水
        先高再低为峰高
        我维护一个数组,记录之前的峰,数组逆序排列【-1】为最小
        !!!
        错了错了,存水是在峰之间,所以要找峰
        找到前两个峰然后双指针往外找
        用不用找峰啊我感觉,找吧
        """
        height.append(0)
        sign=True
        def takesec(gtitem):#这个函数用来给峰按照峰高排队
            return  gtitem[1]
        def count_area(l,r,count,ans):#这个函数用来迭代list_top中的所有元素,是不是也可以写成循环啊?
            if count!=-1:
                if list_top[count][0]<l:
                    for i in range(list_top[count][0]+1,l):
                        if height[i]<height[list_top[count][0]]:
                            ans+=height[list_top[count][0]]-height[i]
                    l=list_top[count][0]
                elif list_top[count][0]>r:
                    for i in range(r+1,list_top[count][0]):
                        if height[i]<height[list_top[count][0]]:
                            ans+=height[list_top[count][0]]-height[i]
                    r = list_top[count][0]
                return count_area(l,r,count-1,ans)
            else:
                return ans
        list_top=[]
        for i in range(len(height)):#找峰,还是-1位置加一个0的老把戏,宽峰怎么办啊,峰宽真的可以忽略,相邻相等的两个峰就是一个0和两个0的区别
            if height[i]>=height[i-1]:
                sign=True
            else:
                if sign:
                    list_top.append([i-1,height[i-1]])
                    sign=False
        list_top.sort(key=takesec)
        if len(list_top)<2:#只有一个峰,直接返回0
            return 0
        else:
            return count_area(list_top[-1][0],list_top[-1][0],len(list_top)-2,0)

写的代码太长了,双指针虽然是官方的一个题解,不过还有单调栈的思路我也想过,(为什么叫单调栈,栈顶的元素是未处理的最矮的栈)

如果碰到比栈顶高的峰,一直出栈,出栈的元素到当前元素的数值全部修改。

等等会放代码,还有没做完的每日一题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值