返回介绍

solution / 1500-1599 / 1558.Minimum Numbers of Function Calls to Make Target Array / README

发布于 2024-06-17 01:03:18 字数 3123 浏览 0 评论 0 收藏 0

1558. 得到目标数组的最少函数调用次数

English Version

题目描述

给你一个与 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

解法

方法一

class Solution:
  def minOperations(self, nums: List[int]) -> int:
    return sum(v.bit_count() for v in nums) + max(0, max(nums).bit_length() - 1)
class Solution {
  public int minOperations(int[] nums) {
    int ans = 0;
    int mx = 0;
    for (int v : nums) {
      mx = Math.max(mx, v);
      ans += Integer.bitCount(v);
    }
    ans += Integer.toBinaryString(mx).length() - 1;
    return ans;
  }
}
class Solution {
public:
  int minOperations(vector<int>& nums) {
    int ans = 0;
    int mx = 0;
    for (int v : nums) {
      mx = max(mx, v);
      ans += __builtin_popcount(v);
    }
    if (mx) ans += 31 - __builtin_clz(mx);
    return ans;
  }
};
func minOperations(nums []int) int {
  ans, mx := 0, 0
  for _, v := range nums {
    mx = max(mx, v)
    for v > 0 {
      ans += v & 1
      v >>= 1
    }
  }
  if mx > 0 {
    for mx > 0 {
      ans++
      mx >>= 1
    }
    ans--
  }
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文