我最近在网上瞄到一贴,问的是:“裁员的时候,是先裁效率低的,还是潜力小的?”说实话,这种问题吧,理想和现实差得有点远。
网友们倒是给出了一套很真实的流程,什么先裁不听话的、再裁效率低的、不出活的,接着是工资高但不属于“嫡系”的,最后才轮到“嫡系”里那些摸鱼的。
不得不说,这回答还挺有道理,我觉得确实有些公司就是这样操作的。裁员从来不只是看绩效,更多时候是人情、站队、关系户,谁是自己人,谁是“外人”,一清二楚。
我觉得身处职场,光想着好好干活真的不够,站队、沟通、合群,这些才是保命符。技术再硬,没人罩着,照样可能被裁;而有些人技术一般,但嘴甜,会来事儿,反而安全。这个世界嘛,现实点,别太天真(备注:文末可领最新资料)。
算法题:图像重叠
在刷题的时候,遇到一道 LeetCode 的题目,名字挺有意思,叫“图像重叠”。一开始还以为是那种图像处理领域的高端题,结果点进去一看,哦,原来是个二进制矩阵移动叠加的题,顿时就感觉轻松了点。
题目说的啥?
给你两个大小相同的正方形矩阵,里头全是 0 和 1,代表两个图像。让你把其中一个图像随便往左、往右、往上、往下滑动,看看怎么滑,能让两个图像中“1”重叠的最多。注意哦,滑动的时候只允许平移,不能旋转,也不能把图像给拉伸什么的,超过边界的部分直接当没了,不参与重叠。
说白了就是,两张图,滑来滑去,找个姿势让它们的“1”叠最多。
思路怎么走?
这种平移、对齐、求重叠的题,第一反应就是暴力法。毕竟,图像也就 n x n 的规模,最多滑个 n-1 个单位,左右上下都有,所以总共滑动的组合数量大概是 (2n - 1) * (2n - 1) 次。别吓一跳,规模不大,能接受。
所以,暴力法的套路就是:咱们把其中一个图像固定,把另一个图像在各种偏移量下滑过去,每滑一次就数数叠加的“1”有多少,最后找出最大值。
这个偏移量咋定义呢?简单来说,咱就用 dx 表示横向偏移,dy 表示纵向偏移。dx 正数就是往右滑,负数往左滑;dy 正数往下滑,负数往上滑。遍历所有可能的 dx 和 dy 组合就好了。
代码长啥样?
直接上 Java 代码,大家一看就懂:
public class Solution {
public int largestOverlap(int[][] img1, int[][] img2) {
int n = img1.length;
int maxOverlap = 0;
// 遍历所有偏移组合
for (int dx = -n + 1; dx < n; dx++) {
for (int dy = -n + 1; dy < n; dy++) {
maxOverlap = Math.max(maxOverlap, calculateOverlap(img1, img2, dx, dy));
}
}
return maxOverlap;
}
private int calculateOverlap(int[][] img1, int[][] img2, int dx, int dy) {
int n = img1.length;
int overlap = 0;
// 计算偏移 dx 和 dy 后的重叠数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int x = i + dx;
int y = j + dy;
// 确保在边界内
if (x >= 0 && x < n && y >= 0 && y < n) {
if (img1[i][j] == 1 && img2[x][y] == 1) {
overlap++;
}
}
}
}
return overlap;
}
}
简单解释一下
主函数largestOverlap就是负责遍历所有可能的滑动组合,dx 和 dy 的范围是从-n + 1到n - 1,确保覆盖了所有平移情况。每种偏移下,都调用一个小助手calculateOverlap来算当前这次平移能带来多少重叠的“1”。
calculateOverlap的逻辑很直接,两个双层 for 循环走一遍图像的每个格子,然后加上偏移量,看看是不是两个图像在同一位置都是 1,如果是,重叠数就加一。别忘了,偏移可能导致坐标跑出边界,所以要判断一下坐标是不是在合法范围内。
性能咋样?
时间复杂度大概是 O(n^4)。为啥呢?因为 dx 和 dy 各要跑 2n-1 次,然后每次偏移要遍历整个 n x n 的矩阵。看起来挺唬人的对吧?但实际上题目限制 n 也就 30 左右,这点量完全扛得住,暴力法在这里简直是神兵利器。
还有优化空间不?
有的。比如,如果你觉得 O(n^4) 太过分了,可以用点数学方法来优化。有人用哈希表来记录偏移向量,把 1 出现的位置都记录下来,再用偏移量去映射,效率能提上来一截。但说实话,题目给的规模不大,暴力解法够用了,省得你一顿骚操作,结果一提交,发现跑得飞快,优化了个寂寞。
总结
这种题目最关键的是别被名字吓住,叫“图像重叠”,其实就是矩阵滑滑乐,滑到哪里“1”最多就行。暴力法是最简单直接的解法,虽然时间复杂度高点,但因为数据规模有限,完全能打。解题的思路也很接地气,就是滑来滑去,数数“1”的重叠数。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
领取专属 10元无门槛券
私享最新 技术干货