首页 > 其他分享 >通过最少操作次数使数组的和相等

通过最少操作次数使数组的和相等

时间:2022-12-07 11:15:07浏览次数:65  
标签:cha int sum2 sum1 次数 最少 数组 nums1 nums2

题目

给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。

每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6)。

请你返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数。如果无法使两个数组的和相等,请返回 -1 。

示例 1:

输入:nums1 = [1,2,3,4,5,6], nums2 = [1,1,2,2,2,2]
输出:3
解释:你可以通过 3 次操作使 nums1 中所有数的和与 nums2 中所有数的和相等。以下数组下标都从 0 开始。

  • 将 nums2[0] 变为 6 。 nums1 = [1,2,3,4,5,6], nums2 = [6,1,2,2,2,2] 。
  • 将 nums1[5] 变为 1 。 nums1 = [1,2,3,4,5,1], nums2 = [6,1,2,2,2,2] 。
  • 将 nums1[2] 变为 2 。 nums1 = [1,2,2,4,5,1], nums2 = [6,1,2,2,2,2] 。
    示例 2:

输入:nums1 = [1,1,1,1,1,1,1], nums2 = [6]
输出:-1
解释:没有办法减少 nums1 的和或者增加 nums2 的和使二者相等。
示例 3:

输入:nums1 = [6,6], nums2 = [1]
输出:3
解释:你可以通过 3 次操作使 nums1 中所有数的和与 nums2 中所有数的和相等。以下数组下标都从 0 开始。

  • 将 nums1[0] 变为 2 。 nums1 = [2,6], nums2 = [1] 。
  • 将 nums1[1] 变为 2 。 nums1 = [2,2], nums2 = [1] 。
  • 将 nums2[0] 变为 4 。 nums1 = [2,2], nums2 = [4] 。

提示:

1 <= nums1.length, nums2.length <= 105
1 <= nums1[i], nums2[i] <= 6

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/equal-sum-arrays-with-minimum-number-of-operations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 贪心+双指针
public static int minOperations(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int sum1= Arrays.stream(nums1).sum();
        int sum2= Arrays.stream(nums2).sum();
        //让nums1为大的数组
        if(sum2>sum1)
        {
            int[] temp= nums1;
            nums1=nums2;
            nums2=temp;
            int temp2=sum1;
            sum1=sum2;
            sum2=temp2;
        }
        int minNum1=nums1.length*6;
        int maxNum2= nums2.length;
        if(minNum1>maxNum2)
        {
            return -1;
        }
        int index1= nums1.length-1;
        int index2= 0;
        int operation = 0;
        while (sum1!=sum2)
        {
            int cha = sum1-sum2;
            if(index1>=0 && index2<nums2.length)
            {
                int num1=nums1[index1];
                int num2=nums2[index2];
                int temp1=num1-1;
                int temp2=6-num2;
                if(temp1==0)
                {
                    index1=-1;
                }

                if(temp2==0)
                {
                    index2=nums2.length;
                }

                if(temp1>temp2)
                {
                    if(cha>temp1)
                    {
                        sum1=sum1-temp1;
                    }
                    else
                    {
                        sum1=sum1-cha;
                    }
                    index1--;
                }
                else
                {
                    if(cha>temp2)
                    {
                        sum2=sum2+temp2;
                    }
                    else
                    {
                        sum2=sum2+cha;
                    }
                    index2++;
                }
                operation++;
                continue;
            }
            if(index1>=0)
            {
                int num1=nums1[index1];
                int temp1=num1-1;
                if(temp1==0)
                {
                    index1=-1;
                }
                else
                {
                    index1--;
                }
                if(cha>temp1)
                {
                    sum1=sum1-temp1;
                }
                else
                {
                    sum1=sum1-cha;
                }
                operation++;
                continue;
            }
            if (index2<nums2.length) {
                int num2=nums2[index2];
                int temp2=6-num2;
                if(temp2==0)
                {
                    index2=nums2.length;
                }
                else
                {
                    index2++;
                }
                if(cha>temp2)
                {
                    sum2=sum2+temp2;
                }
                else
                {
                    sum2=sum2+cha;
                }
                operation++;
                continue;
            }
            if (index1==0 && index2==nums2.length)
            {
                return -1;
            }
        }
        return operation;
    }

标签:cha,int,sum2,sum1,次数,最少,数组,nums1,nums2
From: https://www.cnblogs.com/huacha/p/16962505.html

相关文章

  • js移除数组,删除数组
    一、修改arr的length方法根据修改后的length去除后面的元素。letarr=[1,2,3,4,5,6,7,8,9];arr.length=3;console.log('length',arr.length);//3console.log('a......
  • Java数组转Set的方法
    转:Java数组转Set的方法        ......
  • 数组2
    数组作为函数参数冒泡排序#include<stdio.h>viodbubble_sort(intarr[]){inti=0;intsz=sizeof(arr)/sizeof(arr[0]);for(i=0;i<sz-1;i++){intj=0;for(......
  • 数组:内存分析及三种初始化
    数组(堆和栈的关系)内存分析:通常我们说的分析java内存,指的是分析java的堆内存(heapmemory),稍微扩展点,还可能涉及到持久带内存(jre7以前)或者Metaspace(jre8以后)。.一般的垃圾......
  • 树状数组统计一个数前面有几个数比它小,有几个数比它大
    很重要的算法,蓝桥杯遇到n次了#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;inta[1000010],c[1000010],b[1000010];intlowbit(intx......
  • 快速找出数组中两数的和
    原文:https://blog.csdn.net/weixin_30591551/article/details/94977311能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组......
  • 第二节-创建数组与属性-checkpoint
    创建ndarray对象通过NumPy的内置函数array()可以创建ndarray对象,其语法格式如下:numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin......
  • 数组和集合的增强for
    数组的增强for@Testpublicvoidtest1(){Integer[]integers=newInteger[5];for(inti=0;i<integers.length;i++){integers[i]=i;}......
  • 数组-Array
    数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型数据的集合。  数组的特点:1.数组是相同数据类型的集合。(int类型的数组不能放double......
  • Go-09 Go语言中数组、切片的排序算法以及sort包
    packagemainimport( "fmt" "sort")//Golang数组中的切片及sort包funcmain(){ //1.选择排序 varnumSlice=[]int{9,8,7,6,5,4} fori:=0;i<le......