Contents

ARST打卡第189周[189/521]

Algorithm

lc1703_得到连续K个1的最少相邻交换次数

一开始以为很简单…写了如下代码,然后发现根本想不出来,然后看题解,发现是个数学公式,看了一会,有点难证明,所以暂时先放过这个公式先,投入产出比比较小

 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
31
32
33
34
35
// 双指针,k个1的滑动窗口中的0的最小个数就是答案---感觉不应该是hard吧.2分钟想出来了
/*
写完WA了...21 / 116 个通过的测试用例
解答错误

输入
nums = [1,0,0,1,0,1,1,1,0,1,1]
k = 7

发现自己想得太简单了,这个案例确实没想到...
*/
func minMoves(nums []int, k int) int {
    sz := len(nums)
    one_cnt := 0
    ans := sz
    one2nums_id := make(map[int]int)
    for l, r := 0, 0; r < sz; r++ {
        if nums[r] == 1 {
            // one_cnt从0开始,one2nums_id[0]代表第一个1的位置
            one2nums_id[one_cnt] = r
            one_cnt++
            if one_cnt < k {
                if r == sz-1 {
                    panic("can't find k 1's")
                }
                continue
            }
            l = one2nums_id[one_cnt-k]
            if ans > r-(l-1)-k {
                ans = r - (l - 1) - k
            }
        }
    }
    return ans
}

官方题解如下: https://leetcode.cn/problems/minimum-adjacent-swaps-for-k-consecutive-ones/solutions/2024008/de-dao-lian-xu-k-ge-1-de-zui-shao-xiang-mk5ws/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static inline int min(int a, int b) {
    return a < b ? a : b;
}

int minMoves(int* nums, int numsSize, int k) {
    int g[numsSize], preSum[numsSize + 1];
    int gSize = 0, preSumSize = 0;
    preSum[preSumSize++] = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] == 1) {
            g[gSize++] = i - gSize;
            preSum[preSumSize++] = preSum[preSumSize - 1] + g[gSize - 1];
        }
    }
    int m = gSize, res = INT_MAX;
    for (int i = 0; i <= m - k; i++) {
        int mid = i + k / 2;
        res = min(res, (1 - k % 2) * g[mid] +  \
                        (preSum[i + k] - preSum[mid + 1]) - \
                        (preSum[mid] - preSum[i]));
    }
    return res;
}

Review

【TED演讲】我生命中最艰苦的105天

面对一个艰难的目标,我们的激情,雄心很重要,但是更重要的是,我们需要真正地接受当下的每一个时刻,接受自己当前的混乱与不足,接受自己出现的放弃的念头,然后继续地努力前行,才能完成自己觉得可能完成不了的事情。

Tips

Golang三色标记混合写屏障GC模式全分析

Share-推荐书籍《财务自由之路》

感觉整体上带着读者去分析自己的财务状况,并且推心置腹地给出了很多的有见解的观点,主要让我印象深刻的有如下几点:

  • 钱是很美好的东西,赚钱是对自己创造价值的一种认可,花钱是对自己的生活的一种重要的满足手段
    • 一定要把有钱和很美好的事情联系起来,把没有钱和自己遇到的糟糕的事情联系起来,这样自己才会想要赚钱
    • 对自己的财务状况负责,不要找外部原因,而是不断努力提升自己,去好好搞好自己的财务状况
  • 花90%的时间思考自己为什么做这个事情,花10%的时间想怎么做,而不是反过来
    • 因为自己是动机目的论者,不是因果论者,所以作者这个90%的思考应该怎么做,其实就是让我们想清楚自己到底想要什么,这样才能真正有动力地去实现自己目标
  • 投资赚钱,投机赢钱,投资应该在你买入的时候就产生收益,投机才是卖出的时候产生收益,投资+时间=未来财务自由
  • 不要杀了你下金蛋的鹅,而是先储蓄投资赚出自己的第一个下金蛋的鹅(替你赚钱的机器)
    • 每个人的鹅不一样,具体看每月的固定花费是多少,然后用书中的公式去计算
  • 流入金钱的资产才是投资,流出金钱的资产是负债(包括房子车子)
    • 不是说不让买房车,而是要合理控制自己的资产,在有鹅之后,自住房分期在自己的多个金蛋里面分期买自住房