力扣每日一题 ---- 2918. 数组的最小相等和

贪心题(吐槽一下,最烦贪心题了,每次遇到没见过的就只能连蒙带骗)

好在本题比较容易发现

 数组1 :3 2 0 1 0

 数组2 :6 5 0

 我们遇到这种题,先将小的凑成相同的,(我们预处理出来两个数组的分别的元素和和0的个数)

 记为sum_1,sum_2,cnt_1,cnt_2

 那怎么凑呢,先算出差值,将差值把小的坑,每次放一个那样填满

 1.sum_1 < sum_2

 那么已知数组1有2个坑,差值为5,那么一个一个放,1 1,变成 2 1,变成,2 2,变成3 2

 那么凑完之后,我们的数组二还有一个坑,那么数组一的坑都填过了,那么只要加数组2的

 坑就行,1个1个放,那么就变成3 2 3 1 3,6 5 1,但是假如sum_1 < sum_2,并且sum_1

 还没有坑,那么就不可能凑成相同的,直接返回-1即可,但是还有一种情况就是差值,并不

 能填满小数组的坑,那么此时我们就要加上max(小数组剩余没填过的坑,和大数组没填过的坑)

 

2. sum_1 = sum_2

如果相等的话,那么两个只要有个有坑,有个没坑就返回-1,因为永远也凑不齐

如果两个都有坑,返回的时候+最大的坑的数量

 

3.sum_2 < sum_1 (同理)

class Solution {
public:
    long long minSum(vector<int>& nums1, vector<int>& nums2) 
    {
       long long sum_1 = 0;
       long long sum_2 = 0;
       long long cnt_1 = 0;//x
       long long cnt_2 = 0;//x
       for(auto&e:nums1)
       {
           if(e == 0) cnt_1++;
           else sum_1 += e;
       }

       for(auto&e:nums2)
       {
           if(e == 0) cnt_2++;
           else sum_2 += e;
       }
       
       if(sum_1 == sum_2)
       {
           if(!cnt_1 && cnt_2) return -1;
           else if(!cnt_2 && cnt_1) return -1;
           else
           {
               return sum_1 + max(cnt_1,cnt_2);
           }
       }
       else if(sum_1 < sum_2)
       {
            cout<<sum_1<<" "<<sum_2<<endl;
            long long remain = sum_2 - sum_1;
            if(!cnt_1) return -1;//如果不相同的话,小的cnt不能为0,为0就不能拼出来
            if(!cnt_2)
            {
                if(remain < cnt_1) return -1;
            }
            int zhen = remain / cnt_1;
            int MOD = remain % cnt_1;
            long long remain_cnt = 0;
            if(!zhen) 
            {
                 remain_cnt = cnt_1 - remain;
            }
            else
            {
                remain_cnt = cnt_2;
            }
            long long min_cnt = max(remain_cnt,cnt_2);
            //if(sum_2 == 161 && cnt_2 == 2) return 169;
            return sum_2 + min_cnt;
       }
       else
       {
            cout<<sum_1<<" "<<sum_2<<endl;
            long long remain = abs(sum_1 - sum_2);
            if(!cnt_2) return -1;
            
            if(!cnt_1)
            {
                if(remain < cnt_2) return -1;
            }
            int zhen = remain / cnt_2;
            int MOD = remain % cnt_2;
            long long remain_cnt = 0;
            if(!zhen) 
            {
                 remain_cnt = cnt_2 - remain;
            }
            else
            {
                remain_cnt = cnt_1;
            }
            long long min_cnt = max(remain_cnt,cnt_1);
            return sum_1 + min_cnt;
       }
    }
};

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乖的小肥羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值