leetcode刷题之暴力求解

2023-01-20  本文已影响0人  sk邵楷

leetcode刷题,使用python

1, 加油站 —— 0134 暴力求解 没通过

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

from typing import List

# 暴力求解  不通过
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        n = len(gas)
        j = 0
        remain = 0

        # 总油量 < 总耗油量,一定无解
        if sum(gas) < sum(cost):
            return -1

        for i in range(n):
            j = i
            remain = gas[i]
            # 判断当前剩余的油能否到达下一个点
            while(remain-cost[j]>=0):
                # 减去花费的加上新的点的补给
                remain = remain - cost[j] + gas[(j+1)%n]
                j = (j+1) % n
                # j 回到了 i 即绕了一圈
                if j == i:
                    return i

        # 任何点都不可以
        return -1

S = Solution()
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]

print(S.canCompleteCircuit(gas, cost))

2, 整数替换 —— 0397 遍历所有情况
给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
返回 n 变为 1 所需的 最小替换次数 。

示例 1:
输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1

class Solution:
    def integerReplacement(self, n: int) -> int:
        if n == 1:
            return 0

        if n % 2 == 0:
            return 1 + self.integerReplacement(n//2)

        return 2 +  min(self.integerReplacement(n//2), self.integerReplacement(n//2 + 1))


S = Solution()
n = 8
print(S.integerReplacement(n))
上一篇 下一篇

猜你喜欢

热点阅读