首頁>技術>

題目

給你兩個長度可能不等的整數陣列 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

解題思路分析

1、貪心;時間複雜度O(n),空間複雜度O(1)

func minOperations(nums1 []int, nums2 []int) int {	aMin, bMin := len(nums1), len(nums2)	aMax, bMax := aMin*6, bMin*6	if aMin > bMax || aMax < bMin {		return -1	}	a, b := 0, 0	arrA, arrB := [7]int{}, [7]int{}	for i := 0; i < len(nums1); i++ {		a = a + nums1[i]		arrA[nums1[i]]++	}	for i := 0; i < len(nums2); i++ {		b = b + nums2[i]		arrB[nums2[i]]++	}	if a == b {		return 0	}	if b > a {		arrA, arrB = arrB, arrA		a, b = b, a	}	arr := make([]int, 0) // 儲存	for i := 1; i < 6; i++ {		if arrA[7-i] > arrB[i] {			arr = append(arr, arrA[7-i], arrB[i])		} else {			arr = append(arr, arrB[i], arrA[7-i])		}	}	res := 0	total := a - b	for i := 0; i < len(arr); i++ {		diff := 6 - (i+2)/2		if total-diff*arr[i] > 0 {			total = total - diff*arr[i]			res = res + arr[i]		} else {			if total%diff == 0 {				res = res + total/diff			} else {				res = res + total/diff + 1			}			return res		}	}	return res}

2、貪心;時間複雜度O(n),空間複雜度O(1)

func minOperations(nums1 []int, nums2 []int) int {	aMin, bMin := len(nums1), len(nums2)	aMax, bMax := aMin*6, bMin*6	if aMin > bMax || aMax < bMin {		return -1	}	a, b := 0, 0	arrA, arrB := [7]int{}, [7]int{}	for i := 0; i < len(nums1); i++ {		a = a + nums1[i]		arrA[nums1[i]]++	}	for i := 0; i < len(nums2); i++ {		b = b + nums2[i]		arrB[nums2[i]]++	}	if a == b {		return 0	}	if b > a {		arrA, arrB = arrB, arrA		a, b = b, a	}	arr := make([]int, 6) // 儲存	for i := 1; i < 6; i++ {		arr[i-1] = arr[i-1] + arrA[7-i] + arrB[i]	}	res, total := 0, a-b	for i := 0; i < len(arr); i++ {		diff := 5 - i		if total-diff*arr[i] > 0 {			total = total - diff*arr[i]			res = res + arr[i]		} else {			if total%diff == 0 {				res = res + total/diff			} else {				res = res + total/diff + 1			}			return res		}	}	return res}
總結

Medium題目,採用貪心策略

4
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 「免費」 2021年前端開發的終極資源分享+贈品