Contents

ARST打卡第326周

Algorithm

lc2106_摘水果

思路:

贪心摘水果,就算左右两边都要走,也只会回头一次,否则走了多余的步数。

而且最远左右k步,带折返那边不能超过k/2步。

所以可以遍历所有步行情况,贪心选择最大值。

发现和题解一思路一致,顺便学习一下题解二的滑动区间法。

题解

 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
class Solution {
public:
    int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
        int n = fruits.size();
        vector<int> sum(n + 1);
        vector<int> indices(n);
        for (int i = 0; i < n; i++) {
            sum[i + 1] = sum[i] + fruits[i][1];
            indices[i] = fruits[i][0];
        }
        int ans = 0;
        for (int x = 0; x <= k / 2; x++) {
            /* 向左走 x 步,再向右走 k - x 步 */
            int y = k - 2 * x;
            int left = startPos - x;
            int right = startPos + y;
            int start = lower_bound(indices.begin(), indices.end(), left) - indices.begin();
            int end = upper_bound(indices.begin(), indices.end(), right) - indices.begin();
            ans = max(ans, sum[end] - sum[start]);
            /* 向右走 x 步,再向左走 k - x 步 */
            y = k - 2 * x;
            left = startPos - y;
            right = startPos + x;
            start = lower_bound(indices.begin(), indices.end(), left) - indices.begin();
            end = upper_bound(indices.begin(), indices.end(), right) - indices.begin();
            ans = max(ans, sum[end] - sum[start]);
        }
        return ans;
    }
};

滑动区间法:

 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
class Solution {
public:
    int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
        int left = 0;
        int right = 0;
        int n = fruits.size();
        int sum = 0;
        int ans = 0;

        auto step = [&](int left, int right) -> int {
            if (fruits[right][0] <= startPos) {
                return startPos - fruits[left][0];
            } else if (fruits[left][0] >= startPos) {
                return fruits[right][0] - startPos;
            } else {
                return min(abs(startPos - fruits[right][0]), abs(startPos - fruits[left][0])) + \
                       fruits[right][0] - fruits[left][0];
            }
        };
        // 每次固定住窗口右边界
        while (right < n) {
            sum += fruits[right][1];
            // 移动左边界
            while (left <= right && step(left, right) > k) {
                sum -= fruits[left][1];
                left++;
            }
            ans = max(ans, sum);
            right++;
        }
        return ans;
    }
};

Review

How to get rich?

  1. 对赚钱有接近病态地痴迷 –> 你愿意牺牲多少生活时间
  2. 把90%的时间放在赚钱和如何变富上 –> 无法大富的 full time job 和 电视剧 都会减少你的时间投入!

花多少时间致富,你就会变成多富有的样子。

要么降低预期,要么增加投入。

Tip

Crypto Technology Will Eventually Dominate Finance_Interview with Backpack Founder Armani Ferrante

阿玛尼·费兰特:我希望加密货币能被每个人掌握,让世界上尽可能多的人都能参与其中。 我认为这是必然的。我认为这只是时间的推移,是人类解决难题、技术进步和产品改进的过程。 坦率地说,世代更替,年轻人接触加密货币对他们来说很自然。这很合理。 你知道,无论是千禧一代的 Z 世代还是 Alpha 世代,我们这一代人,随着年龄的增长,在世界上的占比越来越大。 加密货币会越来越普及,最终所有金融领域都会以有意义的方式使用加密货币。 在那样的世界里,我们可以参与其中,成为这种增长的一部分,成为这些产品的一部分, 成为传播加密货币、解决问题并希望改变世界的人的一部分。 我认为金融世界看起来非常不同,开创这个时代的团队将有助于重塑所有基础设施的结构。 所以,我认为成为你的主要金融服务提供商是最终目标。

Share

Neutral Trade 深度解析_Solana 生态的机构级 DeFi 投资平台