【LeetCode刷题】892 三维体的表面积 || 860 找柠檬水

本文介绍两种算法实现:一是计算三维体表面积,通过分析网格上的立方体堆叠,给出一种高效计算其表面积的方法;二是解决找零问题,确保顾客支付过程中的正确找零,适用于柠檬水摊等场景。

892、三维体的表面积

在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
返回结果形体的总表面积。

示例 1:
输入:[[2]]
输出:10

示例 2:
输入:[[1,2],[3,4]]
输出:34

思路分为四步:
第一步:总面试是个数*6
第二步:同一位置,从2层以上开始,每升高一层,减少2个面
第三部:左右位置,每相邻一个,减少2个面
第四步:前后位置,每相邻一个,减少2个面

class Solution:
    def surfaceArea(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        rows = len(grid)
        columns = len(grid[0])
        sum_all = 0
        for i in range(rows):
            for j in range(columns):
                sum_all += grid[i][j] * 6
                if grid[i][j] > 1:
                    sum_all -= (grid[i][j] - 1) * 2

                if j > 0:
                    sum_all -= min(grid[i][j], grid[i][j - 1]) * 2 #当前位置和左边相邻取最小
                if i > 0:
                    sum_all -= min(grid[i][j], grid[i - 1][j]) * 2 #当前位置和上面相邻取最小

        return sum_all

860、找柠檬水

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。
顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

示例 1:

输入:[5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。

思路
分别用3个变量统计当前5美元,10美元,20美元的数量;
当新顾客付款5元时,继续下一个顾客;
当新顾客付款10元时,查看5元的数量是否大于0,若大于0,继续下一个,否则,返回false;
当新顾客付款20元时,首先查看10元的数量是否大于0,如果大于0,查看5元的数量是否大于0;如果10元的数量不大于0,查看5元的数量是否大于等于3。

class Solution(object):
    def lemonadeChange(self, bills):
        count5 = 0
        count10 = 0
        count20 = 0
        for bill in bills:
            charge = bill-5
            if charge == 0:
                count5 += 1
                continue
            elif charge == 5:
                count10 += 1
                if count5>0:
                    count5 -= 1
                    continue
                else:
                    return False
            elif charge == 15:
                count20 +=1
                if count10>1 and count5>1:
                    count5 -= 1
                    count10 -= 1
                    continue
                elif count5>=3:
                    count5 -= 3
                    continue
                else:
                    return False
        return True

bills = [5,5,10,10,20]
solution = Solution()
print(solution.lemonadeChange(bills))


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeremy-Sky

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值