刚看到个贴子:男生年入140万,女朋友15万,差了快10倍,觉得越看越不顺眼,在纠结要不要换一个。

网友们的回复我看了看,有的说“快分,这不门当户对”;也有人提醒他别太现实,赚钱多不代表就更配拥有好感情。
我觉得这事吧,钱只是把心里话放大的放大镜。要是真喜欢,人品、性格、三观是第一位,收入差距是一起商量着补的题;如果已经嫌弃到“看不顺眼”,那就算女生涨薪到五六十万,你也还会找别的理由。
换个角度想,男生有权选择更匹配自己节奏的伴侣,女生也有权不被只拿工资条衡量。
算法题:最接近的三数之和
昨晚快十二点了,我在客厅趴着刷题,电脑一关上,脑子里还在想一个事:为啥“最接近的三数之和”这题,一堆人写着写着就绕晕了,其实思路挺生活化的。
给你一个整数数组 nums,再给一个目标值 target。 从 nums 里随便挑 三个数,把它们加起来,会得到一堆和。 你要找的,就是那个 离 target 最近 的那个和,返回这个和就行。
比如 nums = [-1, 2, 1, -4],target = 1。 所有三数之和有:(-1 + 2 + 1) = 2,(-1 + 2 + -4) = -3,…离 1 最近的是 2,所以答案是 2。
正常人第一反应:那就三重循环呗,三个下标 i、j、k,穷举所有组合,把差值 |sum - target| 最小的那一组记下来。
伪代码差不多是这种感觉:
问题也很直接:**O(n³)**,数据一大就寄了。面试官看你写完三层 for,心里就给你打上“暴力男”标签了。
这题的“提速开关”其实就两步:
具体一点,假设排序后是 nums,长度是 n:
先随便拿一个初始答案,比如前面三个数的和:best = nums[0] + nums[1] + nums[2]
外层循环:枚举第一个数的下标 i,从 0..n-3
对于当前这个 i,内部搞两个指针:
left = i + 1right = n - 1这时候三个数就是:nums[i] + nums[left] + nums[right]记成 sum,对比一下它和 target 谁更近:
|sum - target| < |best - target|,就更新 best然后看 sum 和 target 的大小关系:
sum < target:说明和太小了,想办法变大一点,于是 left += 1sum > target:说明和太大了,那就 right -= 1sum == target:完美命中,直接可以返回了,再算也是这个差距 0为啥这样是对的? 因为数组已经有序了:
i,left 向右走,只会让和变大right 向左走,只会让和变小所以你每一步的调整方向都是“有意义”的,不会乱走,整个复杂度就是 **O(n²)**。
上代码,整一个可直接跑的小例子:
fnthree_sum_closest(mut nums: Vec<i32>, target: i32) -> i32 {// 题目一般保证 len >= 3,这里就不额外判断了 nums.sort(); // 排序是关键let n = nums.len();letmut best = nums[0] + nums[1] + nums[2];for i in0..n - 2 {letmut left = i + 1;letmut right = n - 1;while left < right {let sum = nums[i] + nums[left] + nums[right];// 看看这个 sum 离 target 有多近if (sum - target).abs() < (best - target).abs() { best = sum; }// 双指针移动if sum < target { left += 1; } elseif sum > target { right -= 1; } else {// 正好相等,已经不可能更近了return sum; } } } best}fnmain() {let nums = vec![-1, 2, 1, -4];let target = 1;let ans = three_sum_closest(nums, target);println!("最接近目标的三数之和是: {}", ans);}这里有几个小点,你刷题的时候顺便留个印象:
mut nums: Vec<i32>:参数前面加个 mut,因为我们要在函数里排序,得可变nums.sort():直接就地排序,从小到大for i in 0..n - 2:范围是左闭右开,最后两个位置留给 left 和 right(sum - target).abs():i32 本身就有 abs,不需要额外引库如果你想再抠一点细节,还可以在 for 循环里对 i 做一下去重(当 nums[i] == nums[i-1] 时跳过),不过这题只要“最接近的和”,不要求三元组本身去重,其实无所谓,逻辑反而更简单。
整个套路就是:
你要是能把这题的过程自己在纸上推一遍,保证以后遇到“kSum 相关 + 排序 + 双指针”的题,脑子里立刻能把这套模板搬出来用。