程序员老鬼

外包用不了 vscode,真社畜。。

刚看到个贴子,网友吐槽外包公司不能用VSCode,说自己成了社畜,实在是有点无语。

我觉得吧,工具真的不该成为限制生产力的障碍。

程序员的工作本质上就是“编程”,而VSCode这种工具,简直是开发者的好帮手,插件丰富,调试方便,简直能让人提高工作效率。结果在一些外包公司,连这种自由度都没了,真的是没啥话可说。

说到底,外包公司这么做,可能是为了统一管理或者控制成本。但从程序员的角度看,这种做法实际上是在浪费时间。工具好坏直接影响效率,用不顺手的IDE,岂不是让人更累?而且,程序员本来就面临不少压力,工具不灵活,工作负担更重,能不让人心态崩吗?

其实,外包公司该更注重员工的工作效率和心态,而不是盲目节省成本。工作环境好,才能产出好成果。【备注:文末可领最新资料】

算法题:最大矩形

那天在群里,有个小伙伴问我,“你怎么解最大矩形那道题?”其实这个题我刚看到也觉得挺简单的,就想着要不自己也来做做看看,结果做着做着才发现,哎,感觉不简单啊,特别是要做得高效的时候。

我就先讲讲这个题目。你有个矩阵,里面全是0和1,然后你要找出由1组成的最大矩形,算出它的面积。看上去很简单,对吧?直接暴力解法,把每一个矩形都算一遍,但是显然这不太现实,因为你要考虑的是时间复杂度问题,直接这么做太慢了。

我想了想,肯定得想点优化的办法。后来就想到了一个思路——把每一行都看成一个“底边”,然后把每一列的1给累加起来,形成“柱子”。就是你把每一行的1看成一个柱子,1越多,柱子越高,0就让柱子的高度变成0。这样你就能从上到下形成一个动态变化的柱状图了。这个时候,问题就转化成了“柱状图最大矩形”的问题。想想是不是有点眼熟,柱状图最大矩形这题好像以前也见过类似的做法。

然后你就可以通过栈来求解,简单来说,就是我们用栈来帮助找到每个柱子所能形成的最大矩形,找出最大面积。你看,这样转化之后,时间复杂度就从暴力解法的O(m² * n²)降低到O(m * n),效率高了很多。

好了,扯得有点多,给你们看代码:

import java.util.Stack;

publicclassMaximalRectangle{
publicintmaximalRectangle(char[][] matrix){
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return0;
        }

int m = matrix.length;
int n = matrix[0].length;
int[] heights = newint[n]; // 存储每一列的柱状图高度
int maxArea = 0;

for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 更新每一列的柱子高度
                heights[j] = matrix[i][j] == '1' ? heights[j] + 1 : 0;
            }
// 计算每一行的柱状图最大矩形面积
            maxArea = Math.max(maxArea, largestRectangleArea(heights));
        }

return maxArea;
    }

// 计算柱状图的最大矩形面积
privateintlargestRectangleArea(int[] heights){
int maxArea = 0;
        Stack<Integer> stack = new Stack<>();
int i = 0;

while (i < heights.length) {
if (stack.isEmpty() || heights[i] >= heights[stack.peek()]) {
                stack.push(i++);
            } else {
int height = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
                maxArea = Math.max(maxArea, height * width);
            }
        }

while (!stack.isEmpty()) {
int height = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
            maxArea = Math.max(maxArea, height * width);
        }

return maxArea;
    }
}

这段代码其实就两部分,第一部分是计算每一行的“柱状图”,就是把每一列的1累加起来,形成柱子的高度。如果遇到0,就把该列的高度重置为0。然后第二部分,largestRectangleArea方法就是经典的栈解法,用栈来高效地求每一行的最大矩形面积。

说到时间复杂度,整体是O(m * n),也就是每一行我们更新一次柱状图,并且每一行的最大矩形面积是通过O(n)来计算的。这样总体的效率就大大提高了。

反正我自己做这道题的经验是,刚开始也挺懵的,以为暴力解就能搞定,结果优化思路才让我恍然大悟。这种将矩阵转化为柱状图的问题挺常见的,以后碰到类似的,可以借鉴这个思路。

总的来说,解这种题目要把它拆解清楚,转化思路,然后用合适的数据结构去求解。就像这道题,用栈处理柱状图是个挺不错的选择。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404