力扣-1775通过最少操作次数使数组的和相等

题目链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/equal-sum-arrays-with-minimum-number-of-operations/description/

解题思路:

1.无法相等的情况:当一个数组的长度 比 另一个数组长度*6 还长时 无法相等

2.将两个数组求和(sum_nums)并排序,将和值较大的数组作为数组一,另一个为数组二

3.用i标记数组一(nums1)的最后一个数据,用j标记数组二(nums2)的最后一个数据

4.循环比较nums1[i]-1 和 6-nums2[j] 用min_step=0 记录操作次数

        若nums1[i]-1大,则sum_nums1-(nums1[i]-1),并且 i-1,min_step+1

        若6-nums2[j]大,则sum_nums2+(6-nums[j]),并且 j+1,min_step+1

5.当sum_nums1<=sum_nums2时 循环结束 输出min_step

注意点:

        1.交换数组时,用于记录数组的和、长度的变量都要交换

        2.当i或者j达到边界时,无需进行第3步的比较 直接选择未到边界的进行循环

样例图解:

 我的代码:(语言:GO)

package main

import (
	"fmt"
	"sort"
)

func minOperations(nums1 []int, nums2 []int) int {
	
	//记录数组长度 len函数
	len1, len2 := len(nums1), len(nums2)
	
	//数组排序 sort函数
	sort.Ints(nums1)
	sort.Ints(nums2)
	
	//数组求和
	sum1, sum2 := 0, 0
	for _, v1 := range nums1 {
		sum1 = sum1 + v1
	}
	for _, v2 := range nums2 {
		sum2 = sum2 + v2
	}
	
	//判断是否不能相等 或者 已经相等
	if len1 > (len2 * 6) {
		return -1
	} else if len2 > (len1 * 6) {
		return -1
	} else if sum1 == sum2 {
		return 0
	}

	//实现数组交换
	if sum1 < sum2 {
		sum1, sum2 = sum2, sum1
		nums1, nums2 = nums2, nums1
		len1, len2 = len2, len1
	}
	//fmt.Println(nums1, nums2)
	//fmt.Println(sum1, sum2)

	MinNumber := 0 //记录操作次数
	i, j := len1-1, 0 //i,j分别记录数组一,数组二下标
	//开始循环 当sum1<=sum2时结束循环 因为我在语句中加了sum1=sum2 所以我的判断是sum1!=sum2
	for sum1 != sum2 {
		if i == -1 {
			fmt.Println("1")
			if sum1 <= sum2+(6-nums2[j]) {
				sum1 = sum2
				MinNumber = MinNumber + 1
				return MinNumber
			} else {
				sum2 = sum2 + (6 - nums2[j])
				MinNumber = MinNumber + 1
				j = j + 1
			}
		} else if j == len2-1 {
			fmt.Println("2")
			if sum1-(nums1[i]-1) <= sum2 {
				sum1 = sum2
				MinNumber = MinNumber + 1
				return MinNumber
			} else {
				sum1 = sum1 - (nums1[i] - 1)
				MinNumber = MinNumber + 1
				i = i - 1
			}
		} else if (nums1[i] - 1) >= (6 - nums2[j]) {
			//fmt.Println("3")
			if sum1-(nums1[i]-1) <= sum2 {
				//fmt.Println("3->1")
				sum1 = sum2
				MinNumber = MinNumber + 1
				return MinNumber
			} else {
				//fmt.Println("3->2")
				sum1 = sum1 - (nums1[i] - 1)
				MinNumber = MinNumber + 1
				i = i - 1
			}
		} else {
			//fmt.Println("4")
			if sum1 <= sum2+(6-nums2[j]) {
				sum1 = sum2
				MinNumber = MinNumber + 1
				return MinNumber
			} else {
				sum2 = sum2 + (6 - nums2[j])
				MinNumber = MinNumber + 1
				j = j + 1
			}
		}
		//fmt.Println(sum1, sum2)
		//fmt.Println(MinNumber)
	}
	return MinNumber
}

func main() {
	nums1 := []int{5, 6, 4, 3, 1, 2}
	nums2 := []int{6, 3, 3, 1, 4, 5, 3, 4, 1, 3, 4}
	MinNumber := minOperations(nums1, nums2)
	fmt.Println(MinNumber)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值