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

被折叠的 条评论
为什么被折叠?



