不能加班的人请离开我的团队,我的工作时间是9点到晚上2点
刚看到个贴子,一位领导语出惊人:谁不能加班到凌晨两点,就离开他的团队。工作时间从早上9点拉到深夜2点,他说这才叫“节奏”。
真的是离谱得很。不是谁都能当马斯克,也不是每个项目都值你燃尽自己。写代码讲究效率和脑力,这不是堆时间就能堆出产出的。长期高强度加班只会让人脑袋短路,bug横飞,最后上线前一堆锅还是你自己背。
网友们有支持也有吐槽,但我觉得关键在于:别用PUA式勤奋来证明自己有多拼,真正牛的团队靠的是制度和流程,不是熬夜和血汗。
程序员不是矿工,加班不是生产力,健康和生活也是KPI的一部分。拼的是思路,不是命。【备注:文末可领最新资料】
面试题:2016年的投资
今天来聊一道不太起眼,但却藏着一点“金融脑筋急转弯”的算法题——2016年的投资。这题我当年刷LeetCode的时候看到过,乍一看跟动态规划有关,其实还有点贪心的味道。别小看这题,面试里真能卡住不少人!
我先抛出题目意思:你有若干个投资项目,每个项目有自己的花费和预计收益。你手上有一定启动资金,还能投几轮,问怎么选项目,让你最后赚得最多?
是不是有点像RPG游戏里的“最多经验点分配”?对,就是这种味儿。我们来一步步拆。
首先问题抽象一下:假设你有 k 次投资机会,初始资本为 w,有 n 个项目,每个项目 cost[i] 和 profit[i]。你每次只能选择当前能负担得起的项目投,然后获得收益叠加到当前资金,再继续下一轮。
我当时第一想法就是暴力回溯,结果超时直接炸💥。后来一想这不对啊,这题其实可以贪心搞!具体怎么搞?
那我们来试试贪心 + 堆 的玩法
你每轮都从“当前能投的项目”中挑收益最高的那个,这不是贪心是什么?
于是我用了两个堆👇
import heapq
deffindMaximizedCapital(k, w, profits, capital):
min_cost_heap = [] # 先按照项目花费建最小堆
max_profit_heap = [] # 这个堆记录当前资金能投的项目中的最大利润
for i in range(len(profits)):
heapq.heappush(min_cost_heap, (capital[i], profits[i]))
for _ in range(k):
# 把所有当前能投的项目都移到利润堆里
while min_cost_heap and min_cost_heap[0][0] <= w:
cost, profit = heapq.heappop(min_cost_heap)
heapq.heappush(max_profit_heap, -profit) # Python是最小堆,用负数变最大堆
ifnot max_profit_heap:
break# 没得投了
w += -heapq.heappop(max_profit_heap)
return w
我测了一下,这玩意儿性能直接爆了!🔥 几万个项目都能轻松过。和暴力比,那就是一个在跑步,一个在拄拐杖…
对了,堆的用法建议大家多练,我面试被问了好多次什么“小根堆模拟优先队列”这类问题,熟练掌握真的能救命。
对了,有个坑提醒下:
有同学问:“为啥不用 sorted 把所有能投的项目排一遍?”我试了,排序+剪枝当然可以,但每轮都 sort 效率感人。而堆这玩意儿插入+弹出都是 O(log n),尤其当数据多时,优势明显。
最后总结一下:
1)这题最优解是贪心+堆; 2)核心思路:每轮找你能投的项目里利润最大的那个; 3)维护两个堆:一个花费最小堆(所有项目),一个利润最大堆(你能投的); 4)每轮把你能投的全扔进利润堆,从里边捞个最挣钱的出来投!
算法没那么玄,关键是想清楚怎么动态维护“当前你能选择的最优解”。
这题我觉得可以作为“堆的实战运用”练习,值得刷几遍💪
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领