Algorithm
本周选择的算法题是:Combination Sum IV。
规则
Given an array of distinct integers nums
and a target integer target
, return the number of possible combinations that add up to target
.
The test cases are generated so that the answer can fit in a 32-bit integer.
Example 1:
Input: nums = [1,2,3], target = 4
Output: 7
Explanation:
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
Note that different sequences are counted as different combinations.
Example 2:
Input: nums = [9], target = 3
Output: 0
Constraints:
1 <= nums.length <= 200
1 <= nums[i] <= 1000
- All the elements of
nums
are unique. 1 <= target <= 1000
Follow up: What if negative numbers are allowed in the given array? How does it change the problem? What limitation we need to add to the question to allow negative numbers?
Solution
impl Solution {
pub fn combination_sum4(nums: Vec<i32>, target: i32) -> i32 {
let target = target as usize;
let mut dp = vec![0; target + 1];
dp[0] = 1;
for i in 1..=target {
for num in nums.iter() {
let num = *num as usize;
if i >= num {
dp[i] += dp[i - num]
}
}
}
dp[target]
}
}
Review
Can Carbon replace C++ the way Swift replaced Objective-C?
这篇文章结构如行云流水,层次分明,值得一读。
为什么需要 Carbon?OC <=> Swift、Java <=> Kotlin、Ruby <=> Elixir、C <=> Zig、JavaScript <=> TypeScript,但 C++ 却没有类似的互操作语言。
为什么互操作性重要?迁移成本、维护成本更低,一方面因为高质量的库还可以继续使用,且不需要冗余的胶水代码,另一方面可以完全拥有现代语言的特征,如可选类型、模式匹配等等。最重要的是可以完全控制迁移的速度,就像 OC <=> Swift 那样,各留一半也不影响程序的可运行性。
Carbon 相比 C++ 的语言优势?就像 Swift,错误处理更容易,类型检查可以在编译时减少大量错误,提高程序稳定性。Carbon 也有助于扩大使用人群,新语言更有趣、更容易产生共鸣,虽然 C++ 很优势,但不可否认的一点是它并不是大家的首选语言,某种程度上讲,C++ 算是古老的专家语言,需求培训和多年的实践才能完全掌握。
为什么不用 Rust、Go or Swift?还是互操作性的原因,两种语言之间无缝使用对方的类型是相当高效且诱人的目标。
如果 Carbon 这个想法这么好,为什么不在更早时间出现?什么时间出现什么样的替代品需要结合时间来考虑,C++ 过去有过替代尝试,如 D 语言,但它是 GC 类型语言,性能上差了些;而且 LLVM、Clang 等基础设施工程的成功也大大减少了 C++ 实现的复杂度。过去十年,在其他语言身上有些积极的反馈,如 Swift、Kotlin,Carbon 从它们身上学到了经验、吸取了教训,因此 Carbon 项目是有可能成功的。
Carbon 也可能会失败。Swift 之所以成功,很大一个原因是苹果完全控制了 Mac 世界,包含 OC 这门语言,当苹果说 Swift 是未来时,Swift 必须是未来,开发者只能接受。但没有人控制 C++,没有大公司可以告诉开发者未来会怎样以及他们应该加入进来。哪怕是 Google 也做不到。
Tip
两个思想实验:
- 要学会内省,从三方眼光看组织的决策和对自身的影响,确保自己总有成长,不断提高元认知
- 要保证自己内心健康,不要焦虑、不要犹豫、不要消耗自身的心力
Share
技术人如何提升在工作中的成就感
之前我们提过人有三种动机:
- 外在动机
- 内在动机
- 动机匮乏
这三种动机表明了人的成就感有不同的来源:
- 来自外部奖励
- 来自自我实现
- 无欲无求
如果有可能,请尽量将自己的动机升级,不断接近内在动机,这样你的喜怒哀乐将由你自己掌握。
下面聚焦在具备内在动机的人,如何收获成就感。
内在动机的成就感建立在完全自主状态上,要去做一件事,纯粹是因为这件事本身充满乐趣、有趣,而不是为了追求某个外部奖励或避免某个惩罚。除了因为事情本身可以做好外,还因为在这种状态下,个体的自主、胜任和关系三个基本的心理需求都得到了高度满足 — 形成了成就感。
找到让你充满乐趣、有趣的事,这是第一步。
在《自卑与超越》里,阿德勒讲:“你必须把你的目标和社会的目标统一,这个目标对于你的人生才是有价值和意义的,崇高的目标才有作用。” 我们当然不需要以改变社会作为唯一的目标,但可以试着理解阿德勒背后的逻辑,崇高的目标背后的真正的诉求是 calling,也就是你要找到那种 “召唤”,“召唤” 不仅仅来自了不起的工作,大家一说崇高的目标,就会想到“成为伟人”,其实不一定,我们既可以做非常普通的工作,但在做这份普通工作的同时,得能感受到那种使命感、召唤感。
设置一个让你虎躯一震的目标,这是第二步。
目标定得很宏大这样才显得特别有意义,但执行起来呢?
《圆桌派》嘉宾许子东分享过一个成就感公式:成就感 = 你的能力 / 你的理想 —— 如果设定的理想是200分,能力却只有10分,那成就感就只剩 0.5 了,过大的目标只会带来挫败感,而非成就感。
借助一张图来表达:
图来自《认知觉醒》 一书
要想不断收获成就感,应该做到 Take baby steps —— 从最简单、毫不费力的步骤开始。最关键的不是制定计划,而是能否从中持续收获成就感,或者更专业的说法,正向激励。
正确的做法是:想要实现大目标,先分解成每天的小任务或者里程碑,让它简单、方便执行,完成之后又有激励奖赏作用,这样你就会爱上重复执行,因为能不断收获成就感。
把大目标拆解成清晰的小目标,这是第三步。
总结一下:
- 找到让你充满乐趣、有趣的事
- 设置一个让你虎躯一震的目标
- 把大目标拆解成清晰的小目标
前两者主要的时间花费在赋予目标意义上,这使在最终目标落地的过程中产生更强的专注力、执行力和意志力。