首页 > 其他分享 >「贪心」构成特定和需要添加的最少元素(力扣第1785题)

「贪心」构成特定和需要添加的最少元素(力扣第1785题)

时间:2022-12-16 16:02:45浏览次数:65  
标签:goal nums sum 1785 力扣 添加 limit 数组 贪心

本题为12月16日力扣每日一题

题目来源:力扣第1785题

题目tag:贪心

题面

题目描述

给你一个整数数组nums,和两个整数limit与goal。数组nums有一条重要属性:abs(nums[i]) <= limit 。

返回使数组元素总和等于goal所需要向数组中添加的最少元素数量,添加元素不应改变数组中abs(nums[i]) <= limit这一属性。

注意,如果x >= 0,那么abs(x)等于x;否则,等于-x。

示例

示例 1

输入:

nums = [1,-1,1], limit = 3, goal = -4

输出:

2

解释:

可以将-2和-3添加到数组中,数组的元素总和变为1 - 1 + 1 - 2 - 3 = -4。

示例 2

输入:

nums = [1,-10,9,1], limit = 100, goal = 0

输出:

1

提示

1 <= nums.length <= 105
1 <= limit <= 106
-limit <= nums[i] <= limit
-109 <= goal <= 109


思路分析

一道简单的思维题.

先考虑当前总和(下记为sum)小于goal的情况,此时需要添加一些正数,来填满中间的差.显然应该贪心地每次均填limit,这样可以保证每次填得最多,使得填的次数最少.如果最后恰好放满了,答案即为(goal - sum) / limit.当然,有可能会出现最后一次不够limit,这时只填剩下的差即可,此时答案即为(goal - sum) / limit + 1.

接着考虑sum大于goal的情况,此时需要添加一些负数,来砍掉多出的部分.显然应该贪心地每次砍limit(放入-limit),这样可以保证每次砍得最多,使砍的次数最少.如果最后恰好砍完了,答案即为(sum - goal) / limit.当然,有可能会出现最后一次砍limit太多,这时只砍掉剩下的多出来的部分即可,此时答案即为(sum - goal) / limit + 1.

综上,直接用|goal - sum|作为差值即可统一上面两种情况,得出最后的答案.

参考代码

class Solution
{
public:
    int minElements(vector<int> &nums, int limit, int goal)
    {
        // 求和
        long long sum = 0;
        for (auto i : nums)
        {
            sum += i;
        }

        // 计算差,利用绝对值排除正负干扰(由于个人学校的oj中的abs存在bug,所以个人习惯用fabs取绝对值)
        long long diff = fabs(goal - sum);

        // 分类计算需要几个数
        if (diff % limit == 0)
        {
            return diff / limit;
        }
        else
        {
            return diff / limit + 1;
        }
    }
};

"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德

标签:goal,nums,sum,1785,力扣,添加,limit,数组,贪心
From: https://www.cnblogs.com/geministar/p/LeetCode1785.html

相关文章

  • 力扣---45. 跳跃游戏 II
    给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums......
  • 力扣---55. 跳跃游戏
    给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums=[......
  • [LeetCode] 1785. Minimum Elements to Add to Form a Given Sum
    Youaregivenanintegerarray nums andtwointegers limit and goal.Thearray nums hasaninterestingpropertythat abs(nums[i])<=limit.Return the......
  • 「模拟」字符串转化后的各位数字之和(力扣第1945题)
    本题为12月6日力扣每日一题题目来源:力扣第1945题题目tag:模拟题面题目描述给你一个由小写字母组成的字符串s,以及一个整数k。首先,用字母在字母表中的位置替换该字......
  • 力扣每日一题2022.12.15---1945. 字符串转化后的各位数字之和
    给你一个由小写字母组成的字符串s,以及一个整数k。首先,用字母在字母表中的位置替换该字母,将s转化为一个整数(也就是,'a'用1替换,'b'用2替换,...'z'用26替换)。......
  • 力扣---740. 删除并获得点数
    给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除所有等于 nums[i]-1和nums[i......
  • 力扣---213. 打家劫舍 II
    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互......
  • 从9月开始每天坚持在力扣上刷题,不停学习
       ......
  • 力扣-114-二叉树展开为链表
    按照先序遍历展开展开后仍然为TreeNode,只是左孩子指针一律置空关键在于这个先序的访问过程与各个节点指针的修改操作如何统一不冲突首先就可以排除先序遍历,瞄一眼评论......
  • 力扣 剑指offer05 替换空格
    题目:请实现一个函数,把字符串s中的每个空格替换成"%20"。示例:输入:s="Wearehappy."输出:"We%20are%20happy."思路:直接的思路就是:使用一个新的对象,复制str,复......