力扣第LCP 50题宝石补给 c++ 模拟 注释

题目

LCP 50. 宝石补给

简单

欢迎各位勇者来到力扣新手村,在开始试炼之前,请各位勇者先进行「宝石补给」。

每位勇者初始都拥有一些能量宝石, gem[i] 表示第 i 位勇者的宝石数量。现在这些勇者们进行了一系列的赠送,operations[j] = [x, y] 表示在第 j 次的赠送中 第 x 位勇者将自己一半的宝石(需向下取整)赠送给第 y 位勇者。

在完成所有的赠送后,请找到拥有最多宝石的勇者和拥有最少宝石的勇者,并返回他们二者的宝石数量之差

注意:

  • 赠送将按顺序逐步进行。

示例 1:

输入:gem = [3,1,2], operations = [[0,2],[2,1],[2,0]]

输出:2

解释: 第 1 次操作,勇者 0 将一半的宝石赠送给勇者 2, gem = [2,1,3] 第 2 次操作,勇者 2 将一半的宝石赠送给勇者 1, gem = [2,2,2] 第 3 次操作,勇者 2 将一半的宝石赠送给勇者 0, gem = [3,2,1] 返回 3 - 1 = 2

示例 2:

输入:gem = [100,0,50,100], operations = [[0,2],[0,1],[3,0],[3,0]]

输出:75

解释: 第 1 次操作,勇者 0 将一半的宝石赠送给勇者 2, gem = [50,0,100,100] 第 2 次操作,勇者 0 将一半的宝石赠送给勇者 1, gem = [25,25,100,100] 第 3 次操作,勇者 3 将一半的宝石赠送给勇者 0, gem = [75,25,100,50] 第 4 次操作,勇者 3 将一半的宝石赠送给勇者 0, gem = [100,25,100,25] 返回 100 - 25 = 75

示例 3:

输入:gem = [0,0,0,0], operations = [[1,2],[3,1],[1,2]]

输出:0

提示:

  • 2 <= gem.length <= 10^3
  • 0 <= gem[i] <= 10^3
  • 0 <= operations.length <= 10^4
  • operations[i].length == 2
  • 0 <= operations[i][0], operations[i][1] < gem.length

思路和解题方法

1. 初始化变量 i 为 0。

2. 使用循环,在循环中执行以下步骤,直到 i 达到 operations 的大小:

    - 将位置 operations[i][1] 的宝石数量增加 operations[i][0] 位置的宝石数量的一半。

    - 将位置 operations[i][0] 的宝石数量减少 operations[i][0] 位置的宝石数量的一半。

    - 将 i 的值增加 1,以进行下一轮循环。

3. 使用 min_element 函数找到宝石数量中的最小值,并将结果保存在变量 mn 中。

4. 使用 max_element 函数找到宝石数量中的最大值,并将结果保存在变量 mx 中。

5. 返回 mx - mn,即宝石数量的最大值与最小值之差。

总结来说,这段代码通过根据给定的操作对宝石数量进行增减,然后计算最大值和最小值之间的差值,得出操作后宝石数量的变化范围。

复杂度

        时间复杂度:

                O(n)

遍历 operations 数组需要 O(n) 的时间,其中 n 是 operations 的大小。

使用 min_element 和 max_element 函数分别需要 O(n) 的时间来找到宝石数量的最小值和最大值。 总体而言,时间复杂度为 O(n)。

        空间复杂度

                O(1)

除了输入的 gem 向量和 operations 向量外,并没有使用额外的数据结构来存储信息。

因此,额外的空间复杂度是 O(1),即常数级别的。

c++ 代码

 ​
class Solution {
public:
    int giveGem(vector<int>& gem, vector<vector<int>>& operations) {
        int i = 0; // 初始化操作索引 i 为 0

        while (i < operations.size()) { // 遍历 operations 数组
            // 将位置 operations[i][1] 的宝石数量增加 operations[i][0] 位置的宝石数量的一半
            gem[operations[i][1]] += gem[operations[i][0]] / 2;
            // 将位置 operations[i][0] 的宝石数量减少 operations[i][0] 位置的宝石数量的一半
            gem[operations[i][0]] -= gem[operations[i][0]] / 2;
            i++; // 增加操作索引 i,进行下一轮循环
        }

        // 找到宝石数量中的最小值,并将结果保存在变量 mn 中
        int mn = *min_element(gem.begin(), gem.end());
        // 找到宝石数量中的最大值,并将结果保存在变量 mx 中
        int mx = *max_element(gem.begin(), gem.end());

        return mx - mn; // 返回宝石数量的最大值与最小值之差
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

posted @   lenyan~  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示