class Solution {
public:
int minOperations(vector<int>& nums) {
}
};
1558. 得到目标数组的最少函数调用次数
给你一个与 nums
大小相同且初始值全为 0 的数组 arr
,请你调用以上函数得到整数数组 nums
。
请你返回将 arr
变成 nums
的最少函数调用次数。
答案保证在 32 位有符号整数以内。
示例 1:
输入:nums = [1,5] 输出:5 解释:给第二个数加 1 :[0, 0] 变成 [0, 1] (1 次操作)。 将所有数字乘以 2 :[0, 1] -> [0, 2] -> [0, 4] (2 次操作)。 给两个数字都加 1 :[0, 4] -> [1, 4] -> [1, 5] (2 次操作)。 总操作次数为:1 + 2 + 2 = 5 。
示例 2:
输入:nums = [2,2] 输出:3 解释:给两个数字都加 1 :[0, 0] -> [0, 1] -> [1, 1] (2 次操作)。 将所有数字乘以 2 : [1, 1] -> [2, 2] (1 次操作)。 总操作次数为: 2 + 1 = 3 。
示例 3:
输入:nums = [4,2,5] 输出:6 解释:(初始)[0,0,0] -> [1,0,0] -> [1,0,1] -> [2,0,2] -> [2,1,2] -> [4,2,4] -> [4,2,5] (nums 数组)。
示例 4:
输入:nums = [3,2,2,4] 输出:7
示例 5:
输入:nums = [2,4,8,16] 输出:8
提示:
1 <= nums.length <= 10^5
0 <= nums[i] <= 10^9
原站题解
python3 解法, 执行用时: 780 ms, 内存消耗: 19.5 MB, 提交时间: 2022-11-29 15:54:38
class Solution: def minOperations(self, nums: List[int]) -> int: n = len(nums); cnt = 0 while True: for i in range(n): if nums[i] & 1: cnt += 1 nums[i] >>= 1 if sum(nums) == 0: break cnt += 1 return cnt
cpp 解法, 执行用时: 76 ms, 内存消耗: 24.8 MB, 提交时间: 2022-11-29 15:53:56
class Solution { public: int minOperations(vector<int>& nums) { //我们思考最大数,获取操作数的步骤应该是,1.看此数是否为偶数,若是则除2,再减1,再出2.。。直到此数为0 //得到最大的除2次数,所有数的加1操作单独加在总操作数中。 int n = nums.size(),res=0; int max_mul2 = 0;//最大的乘2数 for(auto &n:nums) { int mul2 = 0; while(n>0) { if(n%2==0) {n = n>>1;mul2+=1;} else {n = n-1;res+=1;} } max_mul2 = max(max_mul2,mul2); } res += max_mul2; return res; } };
java 解法, 执行用时: 36 ms, 内存消耗: 49.6 MB, 提交时间: 2022-11-29 15:52:18
class Solution { // 最大乘2次数 + 加1次数 public int minOperations(int[] nums) { int add = 0, plus = 0; for (int num : nums) { int p = 0; while (num > 0) { if ((num & 1) == 1) { add++; num--; } else { p++; num /= 2; } } plus = Math.max(p, plus); } return add + plus; } }
java 解法, 执行用时: 19 ms, 内存消耗: 49.7 MB, 提交时间: 2022-11-29 15:48:28
class Solution { public int minOperations(int[] nums) { int ret = 0, maxn = 0; for (int num : nums) { maxn = Math.max(maxn, num); while (num != 0) { if ((num & 1) != 0) { ret++; } num >>= 1; } } if (maxn != 0) { while (maxn != 0) { ret++; maxn >>= 1; } ret--; } return ret; } }
python3 解法, 执行用时: 536 ms, 内存消耗: 19.8 MB, 提交时间: 2022-11-29 15:48:08
class Solution: def minOperations(self, nums: List[int]) -> int: maxn = max(nums) ret = 0 for num in nums: while num > 0: if num & 1: ret += 1 num >>= 1 if maxn > 0: while maxn > 0: ret += 1 maxn >>= 1 ret -= 1 return ret