生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
1. 題目
給你兩個(gè)長度可能不等的整數(shù)數(shù)組 nums1 和 nums2 。
兩個(gè)數(shù)組中的所有值都在 1 到 6 之間(包含 1 和 6)。
每次操作中,你可以選擇 任意 數(shù)組中的任意一個(gè)整數(shù),將它變成 1 到 6 之間 任意 的值(包含 1 和 6)。
請你返回使 nums1 中所有數(shù)的和與 nums2 中所有數(shù)的和相等的最少操作次數(shù)。
如果無法使兩個(gè)數(shù)組的和相等,請返回 -1 。
示例
1:
輸入:nums1
= [1,2,3,4,5,6], nums2
= [1,1,2,2,2,2]
輸出:
3
解釋:你可以通過
3 次操作使 nums1 中所有數(shù)的和與 nums2 中所有數(shù)的和相等。
以下數(shù)組下標(biāo)都從
0 開始。
- 將 nums2
[0] 變?yōu)?
6 。 nums1
= [1,2,3,4,5,6], nums2
= [6,1,2,2,2,2] 。
- 將 nums1
[5] 變?yōu)?
1 。 nums1
= [1,2,3,4,5,1], nums2
= [6,1,2,2,2,2] 。
- 將 nums1
[2] 變?yōu)?
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 中所有數(shù)的和與 nums2 中所有數(shù)的和相等。
以下數(shù)組下標(biāo)都從
0 開始。
- 將 nums1
[0] 變?yōu)?
2 。 nums1
= [2,6], nums2
= [1] 。
- 將 nums1
[1] 變?yōu)?
2 。 nums1
= [2,2], nums2
= [1] 。
- 將 nums2
[0] 變?yōu)?
4 。 nums1
= [2,2], nums2
= [4] 。提示:
1 <= nums1
.length
, nums2
.length
<= 10^5
1 <= nums1
[i
], nums2
[i
] <= 6
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/equal-sum-arrays-with-minimum-number-of-operations
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
- 排序,優(yōu)先使用 sum 大的數(shù)組 能降低的最多的,或者 sum 小的數(shù)組能升高最多的
class Solution {
public:int minOperations(vector
<int>& nums1
, vector
<int>& nums2
) {int len1
= nums1
.size(), len2
= nums2
.size();if(len1
> 6*len2
|| len2
> 6*len1
) return -1;sort(nums1
.begin(), nums1
.end());sort(nums2
.begin(), nums2
.end());int s1
= accumulate(nums1
.begin(), nums1
.end(),0);int s2
= accumulate(nums2
.begin(), nums2
.end(),0);if(s1
> s2
){swap(nums1
, nums2
);swap(s1
, s2
);swap(len1
, len2
);}int ans
= 0, i
= 0, j
= len2
-1;int delta1
, delta2
;while(s1
< s2
&& (i
< len1
|| j
>= 0)){delta1
= i
< len1
? 6-nums1
[i
] : 0;delta2
= j
>= 0 ? nums2
[j
]-1 : 0;if(i
< len1
&& delta1
>= delta2
){s1
+= delta1
;i
++;ans
++;}else if(j
>= 0 && delta2
>= delta1
){s2
-= delta2
;j
--;ans
++;}}return ans
;}
};
144 ms 111 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。