LeetCode:1785. 構(gòu)成特定和需要添加的最少元素
題目:
給你一個(gè)整數(shù)數(shù)組?nums
?,和兩個(gè)整數(shù)?limit
?與?goal
?。數(shù)組?nums
?有一條重要屬性:abs(nums[i]) <= limit
?。
返回使數(shù)組元素總和等于?goal
?所需要向數(shù)組中添加的?最少元素?cái)?shù)量?,添加元素?不應(yīng)改變?數(shù)組中?abs(nums[i]) <= limit
?這一屬性。
注意,如果?x >= 0
?,那么?abs(x)
?等于?x
?;否則,等于?-x
?。
難度:中等
示例 1:
輸入:nums = [1,-1,1], limit = 3, goal = -4
輸出:2
解釋:可以將 -2 和 -3 添加到數(shù)組中,數(shù)組的元素總和變?yōu)?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
代碼如下:
class Solution {
public:
? ? int minElements(vector<int>& nums, int limit, int goal) {
? ? ? ? //記錄nums數(shù)組中每一個(gè)數(shù)據(jù)相加之和
? ? ? ? //注意:必須使用longlongint,若用int會(huì)因?yàn)閿?shù)據(jù)過大而溢出
? ? ? ? long long int sum = 0;
? ? ? ? //計(jì)算nums中數(shù)據(jù)之和
? ? ? ? //正常for循環(huán)同樣可以計(jì)算,只需i<nums.size(),但是這樣更快
? ? ? ? for(auto n:nums)
? ? ? ? {
? ? ? ? ? ? sum+=n;
? ? ? ? }
? ? ? ? //計(jì)算目標(biāo)值和數(shù)組中數(shù)據(jù)和的差值的絕對(duì)值用于向上取整。同樣得用longlong
? ? ? ? long long int x = abs(goal-sum);
? ? ? ? //若x能被limit整除,則答案為x/limit;若x不能被整除,則答案為x/limit+1。
? ? ? ? //此時(shí)答案為(x+limit-1)/limit與上面一行等價(jià)(可自行驗(yàn)證)
? ? ? ? return (x+limit-1)/limit;
? ? }
};
很簡單的中等難度題,一共七行代碼就可以寫完。開始int溢出的時(shí)候還以為要邊遍歷邊維護(hù),結(jié)果加個(gè)longlong就完事了