https://leetcode-cn.com/problems/minimum-numbers-of-function-calls-to-make-target-array/
怎样才是最少次数呢,操作有对一个元素加1,对所有元素乘2。数组所有元素从0开始。
反过来思考,对于一个奇数,它的操作是肯定是减1,不可能除2。对于一个偶数,可以减1也可以除2,显然除2比减1的次数更少。除2是对整个数组操作,这就要求所有都是偶数。
所以就是奇数变成偶数,除2。不断重复。
使用0的计数器。
class Solution {
public:
int minOperations(vector<int>& nums) {
int ans=0;
int zero_cnt=0;
int n=nums.size();
for(int i=0;i<n;i++){
if(nums[i]==0){
zero_cnt++;
}
}
while(zero_cnt<n){
for(int i=0;i<n;i++){
if(nums[i]==1){
ans++;
nums[i]=0;
zero_cnt++;
}
else if(nums[i]%2==1){
nums[i]-=1;
ans++;
}
}
if(zero_cnt==n)
break;
for(int i=0;i<n;i++){
nums[i]/=2;
}
ans++;
}
return ans;
}
};