刚看到个贴子,说一哥们一年140万,女朋友一年15万,差了快10倍,没结婚,才谈两年,他越看越不顺眼,在纠结要不要换一个。

我觉得这事吧,关键不在钱,在心态。你嫌弃对方收入低,本质是你已经不认可她这个人了,只是拿收入当理由。
换个角度想,两年时间不短了,如果真在乎,是会想“怎么一起成长”,而不是“我要不要升级换代”。收入差距可以拉平,三观裂开就很难补。
从我的角度看,想清楚:你要的是“同路人”还是“理财产品”。如果只是嫌弃,那早点分手,对她也是解脱;如果还有感情,就别拿钱不停扎人。
晚上下班前,咱们组那个小李一屁股坐我旁边,说东哥你给我讲讲这个“最接近的三数之和”吧,我被这题折腾一下午了。正好电脑还在跑单元测试,我就顺手给他聊了一通,顺便把代码撸了一版 Java 的,你也可以当成一篇完整题解来看。
给你一个整型数组 nums,再给你一个目标值 target,你要从数组里选出 三个数,让它们的和尽量接近 target。最后返回这个和就行,不用把下标和具体是哪三个数交代得那么清楚。
举个小例子:
nums = [-1, 2, 1, -4]target = 1所有三元组的和大概是:
离 1 最近的是 2,所以答案就是 2。
题目不难懂,对吧,难的是怎么写得又快又优雅。
小李一开始写的是三重循环,伪代码差不多这样:
for i:for j:for k: sum = nums[i] + nums[j] + nums[k] 更新最接近的答案时间复杂度 O(n^3),数据量一大,直接超时,面试官当场表情管理失控那种。
所以这个办法只能当“思路自检”: ——我确实知道题目在干嘛,但现在得想办法提速。
这个题跟“三数之和(求和为 0 那个)”是一家人,套路也是一样的:先排序,再固定一个数,另外两个用双指针扫。
整个流程你可以这么记:
把数组从小到大排个序,这一步主要是为了后面双指针能有方向感;
用一个变量 closestSum 记录当前最接近的和;
遍历下标 i,把 nums[i] 当成第一个数;
剩下两个数,用两个指针:
left = i + 1right = n - 1计算当前三数之和 sum = nums[i] + nums[left] + nums[right]
sum 比 target 大,说明和偏大了,right--sum 比 target 小,说明和偏小了,left++sum,都拿它跟 closestSum 比一比,谁离 target 近就留谁有个小细节:如果有一次刚好 sum == target,那就不用再找了,直接可以返回,因为不可能比“刚好等于”更接近了。
时间复杂度就变成 O(n^2),面试题标配。
直接上完整方法,小李就是拿这个在力扣上过的:
import java.util.Arrays;publicclassThreeSumClosestSolution{publicintthreeSumClosest(int[] nums, int target){// 数组长度小于 3,题目一般不会这么搞,// 但我们防御性写一下,随便返回个和if (nums == null || nums.length < 3) {thrownew IllegalArgumentException("数组长度必须 >= 3"); } Arrays.sort(nums);// 初始化的时候随便取前三个的和作为初始值int n = nums.length;int closestSum = nums[0] + nums[1] + nums[2];for (int i = 0; i < n - 2; i++) {// 可选的小优化:如果当前 i 跟上一个数相等,可以跳过// 不跳也不会错,只是会多算一点if (i > 0 && nums[i] == nums[i - 1]) {continue; }int left = i + 1;int right = n - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];// 如果更接近,就更新答案if (Math.abs(sum - target) < Math.abs(closestSum - target)) { closestSum = sum; }// 刚好等于,直接返回,可以提前结束if (sum == target) {return sum; } elseif (sum < target) {// 和太小了,左指针往右挪 left++; } else {// 和太大了,右指针往左挪 right--; } } }return closestSum; }// 简单测一下publicstaticvoidmain(String[] args){ ThreeSumClosestSolution s = new ThreeSumClosestSolution();int[] nums = {-1, 2, 1, -4};int target = 1; System.out.println(s.threeSumClosest(nums, target)); // 输出 2 }}面试里如果你能先说出暴力解,再顺滑地过渡到“既然三数之和那题可以用排序 + 双指针,这个也能复用同一个套路”,然后手起刀落写出上面那版 Java,基本这道题就很稳了。
🔥东哥私藏精品🔥
东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB。