“王炸女生”,93年,168,博士毕业,律师,江西人,有个弟弟
刚看到个贴子,说有个“王炸女生”,93年,168,博士、律师、颜值高、工作稳,但被男生们一看资料就拒了,理由是:江西彩礼高、还得扶弟魔。
我觉得这事挺耐人寻味的。按理说,这样的女生条件已经很优秀了,可现实偏偏是,太优秀反而成了“负担”。有网友说是彩礼问题,其实背后是对“婚后压力”的恐惧——怕负担太大,怕结婚不是两个人的事,而是一家人的事。
但话说回来,一个女生能靠自己读到博士、当上律师,说明她足够独立、有主见。真要说扶弟,那也是她的选择,不代表她就一定是“拖累型”。
算法题:每日温度
先把题意思路捋一下:给你一串每天的温度t[0..n-1],对每一天i,问再往后第一个比t[i]高的那天相隔几天;如果后面再也没更暖,就写0。嗯,像在等回暖的通知单。
最直白是双重循环:每一天往后找第一个更高的。能过小数据,但最坏要比到天荒地老,O(n²),数组一长立刻超时。
真正好用的是“单调栈”
我们维护一个存放下标的栈,栈里对应的温度从栈底到栈顶递减。往右扫数组:
当前日 i来了,如果t[i]比栈顶那天还暖,说明栈顶那个等的就是今天:弹出j,答案ans[j]=i-j。继续比,直到栈为空或t[i]不更高为止。然后把 i压栈,表示它也开始等更暖的一天。 这样每个下标最多进一次、出一次,整体O(n)。
为啥递减?因为只有遇到“更高”的人,才能一并帮之前比它低的那些人完成配对;而更低或相等的留着栈里继续等。
import java.util.*;
publicclassDailyTemperatures{
publicint[] dailyTemperatures(int[] temps) {
int n = temps.length;
int[] ans = newint[n];
Deque<Integer> st = new ArrayDeque<>(); // 存下标,栈内温度递减
for (int i = 0; i < n; i++) {
while (!st.isEmpty() && temps[i] > temps[st.peek()]) {
int j = st.pop();
ans[j] = i - j;
}
st.push(i);
}
return ans;
}
// 简单自测
publicstaticvoidmain(String[] args){
DailyTemperatures s = new DailyTemperatures();
int[] in = {73,74,75,71,69,72,76,73};
System.out.println(Arrays.toString(s.dailyTemperatures(in)));
// 期望:[1,1,4,2,1,1,0,0]
}
}
复杂度与几个小坑
时间O(n),空间O(n)(最坏所有天递减都压栈)。 坑点别踩:
相等温度不算更暖,所以条件要用 >而不是>=。栈里放下标而不是温度值,方便直接算距离。 如果输入可能很大,优先用 ArrayDeque而非Stack(更轻量)。
变体脑补一下
从右往左也能做:维护递减栈,遇到更高就弹,最后栈顶就是答案下标。同理O(n)。还有人用“下一更大元素”的模板做,思路一模一样。
就这样,一个栈,来一遍,等暖天这件小事儿就搞定了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html