Leetcode5481. 得到目标数组的最少函数调用次数【第 33 场双周赛】【贪心】

题目链接
题意:给定一目标序列和等长的初始序列(初始序列全为0),给定两种操作:

  1. 序列中所有数×2
  2. 对某个数+1

问将初始序列变为目标序列的最少操作次数。
思路:显然我们要尽量多使用*2操作,故我们对每一个数字 x x x统计从0变为 x x x所需的操作1和操作2的数量,统计过程中贪心使用操作1。那么我们对所有数的操作1维护一个最大值(所有数可以一起×2),对操作2累加即可。

class Solution {
public:
    int minOperations(vector<int>& nums) {
        int n=nums.size(),m=-1,ans=0;
        vector<int> a(n),b(n);
        for(int i=0;i<n;i++){
            int x=nums[i];
            while(x){
                if(x&1){
                    x--;
                    b[i]++;
                }
                else{
                    x>>=1;
                    a[i]++;
                }
            }
            m=max(a[i],m);
            ans+=b[i];
        }
        return ans+m;
    }
};

你可能感兴趣的:(Leetcode,算法,leetcode,贪心算法)