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

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

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


好在本题比较容易发现

4.png


数组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;
       }
    }
};
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
3月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
3月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 03. 数组中重复的数字
解决剑指Offer题目 "数组中重复的数字" 的Python实现方法,通过使用字典来记录数组中每个数字的出现次数,快速找出重复的数字。
37 1
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
3月前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
29天前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
18 4
|
29天前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
17 0
Leetcode第三十三题(搜索旋转排序数组)
|
29天前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
51 0