美文网首页
【教3妹学编程-算法题】超过阈值的最少操作数 II

【教3妹学编程-算法题】超过阈值的最少操作数 II

作者: 程序员小2 | 来源:发表于2024-03-04 22:21 被阅读0次
    瑟瑟发抖

    2哥 : 叮铃铃,3妹,准备复工了啊,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。
    3妹:切,不想上班,假期能不能重来一遍啊,虽然在家我妈张罗着要给我相亲呢。可是在家还是很好的啊。
    2哥 : 相亲?哈哈哈哈
    3妹:别笑了,我妈说跟我年龄相等的人都已经孩子上小学了,跟她年龄相等的人孙子最少都会打酱油了。
    2哥 :哈哈哈哈,让我先笑一会儿
    3妹:话说2哥过年在家里也刷题吗?
    2哥:当然了,雷打不动。
    3妹:好吧,还得是2哥🐂,我有几天懈怠了。
    2哥:好吧,说到刷题啊,今天有一道“最少”的题目, 让我们先做一下吧~

    吃瓜

    题目:

    给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

    一次操作中,你将执行:

    选择 nums 中最小的两个整数 x 和 y 。
    将 x 和 y 从 nums 中删除。
    将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。
    注意,只有当 nums 至少包含两个元素时,你才可以执行以上操作。

    你需要使数组中的所有元素都大于或等于 k ,请你返回需要的 最少 操作次数。

    示例 1:

    输入:nums = [2,11,10,1,3], k = 10
    输出:2
    解释:第一次操作中,我们删除元素 1 和 2 ,然后添加 1 * 2 + 2 到 nums 中,nums 变为 [4, 11, 10, 3] 。
    第二次操作中,我们删除元素 3 和 4 ,然后添加 3 * 2 + 4 到 nums 中,nums 变为 [10, 11, 10] 。
    此时,数组中的所有元素都大于等于 10 ,所以我们停止操作。
    使数组中所有元素都大于等于 10 需要的最少操作次数为 2 。
    示例 2:

    输入:nums = [1,1,2,4,9], k = 20
    输出:4
    解释:第一次操作后,nums 变为 [2, 4, 9, 3] 。
    第二次操作后,nums 变为 [7, 4, 9] 。
    第三次操作后,nums 变为 [15, 9] 。
    第四次操作后,nums 变为 [33] 。
    此时,数组中的所有元素都大于等于 20 ,所以我们停止操作。
    使数组中所有元素都大于等于 20 需要的最少操作次数为 4 。

    提示:

    2 <= nums.length <= 2 * 10^5
    1 <= nums[i] <= 10^9
    1 <= k <= 10^9
    输入保证答案一定存在,也就是说一定存在一个操作序列使数组中所有元素都大于等于 k 。

    思路:

    思考

    注意题目说每次选择最小的两个数操作。那么用最小堆模拟即可。

    java代码:

    class Solution {
        public int minOperations(int[] nums, int k) {
            int ans = 0;
            PriorityQueue<Long> pq = new PriorityQueue<>();
            for (int x : nums) {
                pq.offer((long) x);
            }
            while (pq.peek() < k) {
                long x = pq.poll();
                long y = pq.poll();
                pq.offer(x * 2 + y);
                ans++;
            }
            return ans;
        }
    }
    

    相关文章

      网友评论

          本文标题:【教3妹学编程-算法题】超过阈值的最少操作数 II

          本文链接:https://www.haomeiwen.com/subject/jimrzdtx.html