python写算法题:leetcode: 42. Trapping Rain Water

115 篇文章 0 订阅
class Solution(object):
    def swap(self, items, ind, i, j):
        tmp=items[i]
        items[i]=items[j]
        items[j]=tmp
        tmp=ind[i]
        ind[i]=ind[j]
        ind[j]=tmp
    def quicksort(self, items, ind, start, end):
        if start>=end: return
        mid=start
        midv=items[mid]
        for i,item in enumerate(items[start+1:end]):
            if item>midv:
                self.swap(items, ind, mid+1, mid)
                if start+1+i!=mid+1:
                    self.swap(items, ind, start+1+i, mid)
                mid+=1
        self.quicksort(items, ind, start, mid)
        self.quicksort(items, ind, mid+1, end)
    
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        ind = [ i for i in xrange(len(height)) ]
        maxh=0
        self.quicksort(height, ind, 0, len(height))
        #print height, ind
        watermap=[]
        height0=0
        wid=[]
        s=0
        for i in xrange(len(height)-1):
            newpit=1
            for pit in wid:
                if ind[i+1]>pit[0] and ind[i+1]<pit[1]:
                    s-=height[i+1]
                    newpit=0
                    break
            if newpit==1:
                if len(wid)>0:
                    if ind[i+1]<wid[0][0]:
                        wid.insert(0, (ind[i+1],wid[0][0]))
                        s+=height[i+1]*(wid[0][1]-wid[0][0]-1)
                    else:
                        wid.append((wid[-1][1], ind[i+1]))
                        s+=height[i+1]*(wid[-1][1]-wid[-1][0]-1)
                else:
                    if ind[i]<ind[i+1]:
                        wid.append((ind[i],ind[i+1]))
                    else:
                        wid.append((ind[i+1],ind[i]))
                    s+=height[i+1]*(wid[0][1]-wid[0][0]-1)
        return s

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值