二分法Lintcode

875爱吃香蕉的珂珂

class Solution:
    def minEatingSpeed(self, piles: List[int], H: int) -> int:
        # 暴力
        K_max = max(piles)
        for i in range(1, K_max + 1):
            if self.canEatAll(piles, i) <= H:
                return i

        # 二分法
        left, right = 1, max(piles)
        while left + 1 < right:
            mid = left + (right - left) // 2
            if self.canEatAll(piles, mid) <= H:
                right = mid
            else:
                left = mid
        if self.canEatAll(piles, left) <= H:
            return left
        return right

    def canEatAll(self, piles, K):
        ans = 0
        for pile in piles:
            ans += (pile - 1) // K + 1
        return ans

258地图跳越

class Solution:
    """
    @param arr: the map
    @return:  the smallest target that satisfies from the upper left corner (0, 0) to the lower right corner (n-1, n-1)
    """
    def mapJump(self, arr):
        # Write your code here.
        self.DIRECTIONS = [[1, 0],
        [-1, 0],
        [0, 1],
        [0, -1]
        ]
        left, right = 0, 100000
        while left + 1 < right:
            print(left, right)
            mid = left + (right - left) // 2
            if self.bfs(mid, arr):
                right = mid
            else:
                left =mid
        if self.bfs(left, arr):
            return left
        return right
    
    def bfs(self, target, arr):
        n, m = len(arr), len(arr[0])
        visited = [[0] * m for _ in range(n)]
        deq = collections.deque()
        deq.append((0, 0))
        visited[0][0] = 1
        while deq:
            x, y = deq[0][0], deq[0][1]
            deq.popleft()
            if x == n - 1 and y == m - 1:
                break
            for i in range(4):
                newX = x + self.DIRECTIONS[i][0]
                newY = y + self.DIRECTIONS[i][1]
                if newX < 0 or newX >= n or newY < 0 or newY >= m:
                    continue
                if abs(arr[x][y] - arr[newX][newY]) > target or visited[newX][newY] == 1:
                    continue
                deq.append((newX, newY))
                visited[newX][newY] = 1
        return visited[n - 1][m - 1] == 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值