Contents

ARST打卡第280周

lc2848_与车相交的点 你可以像电脑一样思考,做出最佳选择【TED演讲】 Google Percolator 坚持锻炼身心,追求理想中应对虚无,穿越周期

Algorithm

lc2848_与车相交的点

思路:

排序后遍历即可.

因为还在熟悉rust,所以让cursor教我,发现rust对于这种排序竟然比c++还方便,不过c++应该也能这样匿名函数吧:

这里面是二维整数数组,对于任意下标 i,nums[i] = [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。教我怎么用rust写按第一个数值排序后遍历的算法。

这里改了 leetcode 的参数,leetcode 入参是不可变的,这里改成可变的,方便排序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
impl Solution {
    pub fn number_of_points(mut nums: Vec<Vec<i32>>) -> i32 {
        // Rust排序
        nums.sort_by(|a, b| a[0].cmp(&b[0]));
        
        // C++排序等价写法:
        // std::sort(nums.begin(), nums.end(), [](const vector<int>& a, const vector<int>& b) {
        //     return a[0] < b[0];
        // });

        let mut result = 0;
        let mut max_end = -1;
        
        // 遍历排序后的数组
        for car in nums {
            let start = car[0];
            let end = car[1];
            
            if start > max_end {
                result += end - start + 1;
            } else if end > max_end {
                result += end - max_end;
            }
            
            max_end = max_end.max(end);
        }
        
        result
    }
}

题解 还有计数算法和差分数组算法,学习了一下,贴出差分数组算法:

不过这个题目的数据集测出来的结果还是sort更快。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
impl Solution {
    pub fn number_of_points(nums: Vec<Vec<i32>>) -> i32 {
        let mut C = 0;
        for interval in &nums {
            C = C.max(interval[1]);
        }

        let mut diff = vec![0; (C + 2) as usize];
        for interval in &nums {
            diff[interval[0] as usize] += 1;
            diff[(interval[1] + 1) as usize] -= 1;
        }

        let mut ans = 0;
        let mut count = 0;
        for i in 1..=C {
            count += diff[i as usize];
            if count > 0 {
                ans += 1;
            }
        }

        ans
    }
}

Review

你可以像电脑一样思考,做出最佳选择【TED演讲】

  • 深度广度搜索选择项
  • LRU存取选择(其实也就是大脑默认堆放草稿文件的方式)
  • 最终用最优方法,抓住机会尽力而为,而不是反复思考所有选择导致错过机会

Tips

Google Percolator

Google Percolator 是在 BigTable 上构建的分布式事务系统。 是当初 TiKV 实现时借鉴的重要论文资料,文中详细介绍了需求背景,设计思路,和一些应用场景和效果,非常值得一读。

Share

中午看到B站一条视频发的新视频。引发了一些反思:

坚持锻炼身心,追求理想中应对虚无,穿越周期

姚洋: 经济学家,北京大学国家发展研究院教授。 还是鼓励大家去奋斗,未来要活90岁的。35岁并不是一个很大的年纪。

Q: 如何避免陷入对于人生意义的虚无主义?

A: 去做,人生的意义就是去做一个唐吉坷德吧。

求助GPT4o:

把人生的意义比作做一个“唐吉诃德”,是一种富有哲学意味的表达。唐吉诃德是塞万提斯小说中的主人公,他幻想自己是一个骑士,执着于追求虚幻的理想,尽管现实与他的理想严重脱节。他的行为看似荒唐甚至可笑,但却透露出深刻的人生哲理。

将人生的意义与唐吉诃德联系起来,可能包含以下几个层面的理解:

  1. 理想主义与现实的冲突:唐吉诃德代表了一种理想主义,追求梦想、正义和荣誉,尽管这些理想在现实中并不总是能够实现。在现实生活中,我们常常面临理想和现实的冲突,追求自己的信念往往会遇到重重困难和嘲讽。把人生看作是做一个“唐吉诃德”,意味着不论现实多么残酷,依然选择追逐理想,哪怕这些理想看似不切实际。

  2. 坚持与勇敢:唐吉诃德始终坚持自己的信念,哪怕所有人都认为他是疯子,他依旧一往无前。这种精神可以被视为一种勇敢和坚持。在人生中,我们会遇到许多失败、挫折和质疑,但如果像唐吉诃德那样坚定信念,或许能发现人生的独特意义。

  3. 追寻意义的过程:唐吉诃德的故事强调的是一种追求的过程,而不是结果。虽然他最终未能实现自己的梦想,但他却在追求梦想的过程中找到了自己的价值。人生的意义或许就在于这种追寻,即便结果未必如愿,但追求的过程本身就是一种成长和意义的来源。

  4. 超越功利的生活态度:在现实生活中,许多人追求物质利益和外在成功,而唐吉诃德的行为却是纯粹为理想而活。把人生看作是做一个唐吉诃德,意味着一种超越功利主义的生活态度,强调内心的丰富和精神的自由,追求那些超越物质的东西。

因此,理解“人生的意义就是去做一个唐吉诃德”,可以看作是倡导一种追求理想、坚持自我、并从追求过程中找到意义的人生态度。

Q: 如何熬过周期?

A: 别老是刷手机,读历史,看看魏晋南北朝时期,就会发现,其实现在的情况已经很好了。

记住锻炼身体和心态,身心好,一切都好。