สมมติว่าเรามีอาร์เรย์ที่เรียกว่า nums1 และ nums2 สองอาร์เรย์ ค่าในอาร์เรย์อยู่ระหว่าง 1 ถึง 6 (รวม) ในการดำเนินการเดียว เราสามารถอัปเดตค่าใดๆ ในอาร์เรย์ใดก็ได้ให้เป็นค่าใดๆ ระหว่าง 1 ถึง 6 เราต้องหาจำนวนการดำเนินการขั้นต่ำที่จำเป็นในการหาผลรวมของค่าใน nums1 เท่ากับผลรวมของค่าใน nums2 เราต้องคืน -1 ถ้าเป็นไปไม่ได้
ดังนั้น ถ้าอินพุตเป็น nums1 =[1,5,6], nums2 =[4,1,1] ผลลัพธ์จะเป็น 2 เพราะเราสามารถเปลี่ยน nums2 จาก [4,1,1] เป็น [4, 1,6] ในการดำเนินการครั้งแรก และ [4,2,6] ในการดำเนินการครั้งที่สองเพื่อให้เท่ากับ nums1
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
s1 :=ผลรวมขององค์ประกอบทั้งหมดใน nums1
-
s2 :=ผลรวมขององค์ประกอบทั้งหมดใน nums2
-
เรียงลำดับรายการ nums1 และเรียงลำดับรายการ nums2
-
ถ้า s1> s2 แล้ว
-
สลับ nums1 และ nums2
-
สลับ s1 และ s2
-
-
ตอบ :=0
-
ซ้าย :=0, ขวา :=ขนาดของ nums2 -1
-
ขณะที่ซ้าย <ความยาวของ nums1 หรือขวา>=0 ทำ
-
ถ้า s1 เหมือนกับ s2 แล้ว
-
กลับมาอีกครั้ง
-
-
curr_left :=nums1[left] if left
-
curr_right :=nums2[right] if right>=0 มิฉะนั้น 0
-
ถ้า 6-curr_left>=curr_right-1 แล้ว
-
s1 :=s1 + ขั้นต่ำ 6-curr_left และ s2-s1
-
ซ้าย :=ซ้าย + 1
-
-
มิฉะนั้น
-
s2 :=s2 - ขั้นต่ำของ curr_right-1 และ s2-s1
-
ขวา :=ขวา - 1
-
-
ans :=ans + 1
-
-
คืนค่า -1 หาก s1 ไม่เหมือนกับ s2 มิฉะนั้นจะเป็น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(nums1, nums2): s1 = sum(nums1) s2 = sum(nums2) nums1.sort() nums2.sort() if s1>s2: nums1, nums2 = nums2, nums1 s1, s2 = s2, s1 ans = 0 left, right = 0, len(nums2)-1 while(left<len(nums1) or right>=0): if s1==s2: return ans curr_left = nums1[left] if left<len(nums1) else 7 curr_right = nums2[right] if right>=0 else 0 if 6-curr_left>=curr_right-1: s1+= min(6-curr_left, s2-s1) left+=1 else: s2-= min(curr_right-1, s2-s1) right-=1 ans+=1 return -1 if s1!=s2 else ans nums1 = [1,5,6] nums2 = [4,1,1] print(solve(nums1, nums2))
อินพุต
[1,5,6], [4,1,1]
ผลลัพธ์
2