程序员老鬼

“王炸女生”,93年,168,博士毕业,律师,江西人,有个弟弟

刚看到个贴子,说有个“王炸女生”,93年,168,博士、律师、颜值高、工作稳,但被男生们一看资料就拒了,理由是:江西彩礼高、还得扶弟魔。

Image

我觉得这事挺耐人寻味的。按理说,这样的女生条件已经很优秀了,可现实偏偏是,太优秀反而成了“负担”。有网友说是彩礼问题,其实背后是对“婚后压力”的恐惧——怕负担太大,怕结婚不是两个人的事,而是一家人的事。

但话说回来,一个女生能靠自己读到博士、当上律师,说明她足够独立、有主见。真要说扶弟,那也是她的选择,不代表她就一定是“拖累型”。

在我看来,结婚最怕的不是彩礼,而是互相防备。谁都怕被算计,但也别动不动就先预设对方是“坑”。【备注:文末可领最新资料】

算法题:每日温度

先把题意思路捋一下:给你一串每天的温度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

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