没想到,竟然还有人因为降薪而选择极端方式来“维权”!这事发生在某大行的员工身上,听说他因为银行改制降薪,情绪失控,最后竟然选择上吊维权!
虽然很无奈,但不得不说,解决问题不应该依赖极端手段。
我们不是也经常遇到项目难度大、系统崩溃的情况吗?每次出问题,我们都得沉下心来调试、找到根本原因,而不是因为一个bug就选择摧毁整个系统。
工作和生活一样,遇到问题就去解决,不要轻易放弃。尤其是对待“降薪”这种事,适时调整心态,必要时可以选择跳槽,别让自己被压垮了。
其实所有行业都一样,都有太多的不确定因素,要想不被折叠真的要不断学习呀,所以我今天又给大家准备了一道经典算法题,快学起来!
算法题:最长有效括号
和大家聊一个经典的算法题:最长有效括号。要说这题嘛,它的难度不高,但要想在面试中拿到高分,还是得动点脑筋的。
首先,题目要求我们给定一个只包含 (
和 )
的字符串,求字符串中最长有效括号的长度。什么是有效括号呢?简单来说,就是一个括号匹配且完整的子串,比如“()`”,或者“(())”。看似简单,但细节上却不容忽视。
接下来,我带大家通过两种常见的解法来解决这个问题。一种是通过栈的方式,另一种是通过动态规划。两种方式各有千秋,选哪个就看个人偏好啦。
栈法是这类问题的经典解法。
在这道题中,我们利用栈来跟踪括号的匹配情况。栈里面不仅仅存放括号的索引,还可以帮助我们计算有效括号的长度。
简单来说,我们从左到右遍历字符串。当遇到一个左括号时,把它的索引推入栈中。当遇到右括号时,检查栈顶的元素。如果栈顶元素是一个左括号的索引,我们就认为形成了一个有效的括号对,然后更新最大有效括号的长度。
如果栈顶不是左括号的索引,说明这个右括号没有匹配的左括号,于是我们就把它当作一个新的起点,继续往后走。
下面是具体的代码实现:
public class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<>();
stack.push(-1); // 初始化栈,存放-1作为基准点
int maxLength = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
stack.push(i); // 左括号,压入栈
} else {
stack.pop(); // 右括号,弹出栈顶元素
if (stack.isEmpty()) {
stack.push(i); // 如果栈为空,说明当前右括号无匹配,设置新的基准点
} else {
maxLength = Math.max(maxLength, i - stack.peek()); // 更新最大有效括号长度
}
}
}
return maxLength;
}
}
具体来说,我们用一个数组 dp
来存储到当前位置的最大有效括号长度。对于每个字符,若当前位置是右括号,并且它的前一个字符是左括号,那么我们就更新 dp[i]
的值。更新的公式如下:
如果当前位置是左括号 (
,则跳过,dp[i] = 0
;如果当前位置是右括号 )
,如果它的前面是左括号(
,我们就把前面的那个左括号加入计算,dp[i] = dp[i-2] + 2
;如果当前位置是右括号 )
,且前面是一个已经匹配的右括号,我们就需要检查前面的括号是否能和当前括号配对。
代码实现如下:
public class Solution {
public int longestValidParentheses(String s) {
int maxLength = 0;
int[] dp = new int[s.length()];
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == ')') {
// 如果前一个字符是左括号,且当前字符是右括号
if (s.charAt(i - 1) == '(') {
dp[i] = (i - 2 >= 0 ? dp[i - 2] : 0) + 2;
} else {
// 如果前一个字符是右括号,检查前面的有效括号是否配对
int match = i - dp[i - 1] - 1;
if (match >= 0 && s.charAt(match) == '(') {
dp[i] = dp[i - 1] + 2 + (match - 1 >= 0 ? dp[match - 1] : 0);
}
}
maxLength = Math.max(maxLength, dp[i]);
}
}
return maxLength;
}
}
在上述两种方法中,栈法的时间复杂度是 O(n),空间复杂度也是 O(n)。
而动态规划的时间复杂度同样是 O(n),但是空间复杂度是 O(n) 由于我们使用了一个额外的数组。如果不想额外使用空间,我们还可以通过常数空间来优化这部分,使用两个变量来记录当前的最大长度。
这道题虽然看起来简单,但往往给初学者带来很大的困惑。很多人往往会卡在栈或者动态规划的实现上,尤其是在考虑如何更新最大长度的时候,总是容易掉进“坑”里。所以,大家在做这类题时,一定要仔细考虑不同情况,确保每一个细节都没有遗漏。
其实,算法这东西,最重要的就是多练习,慢慢积累经验。今天能解决问题,明天一定能遇到更有趣的挑战!
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。