মনে করুন M এবং T একই সারি ও কলামের দুটি ম্যাট্রিক্স। একটি অপারেশন: একটি কলাম ফ্লিপ করলে সেটির সব ১ হয় ০, ০ হয় ১। সারি রি-অর্ডার ফ্রি। M কে T-তে রূপান্তরের ন্যূনতম অপারেশন খুঁজে বের করতে হবে। সমাধান না থাকলে -1।
ইনপুট ম্যাট্রিক্স এবং টার্গেট ম্যাট্রিক্সের টেবিল দেওয়া আছে, আউটপুট ১।
সমাধানের ধাপসমূহ
- nums1, nums2 := নতুন তালিকা
- প্রতিটি row matrix-এ, বাইনারি থেকে ডেসিমেল কনভার্ট করে nums1-এ যোগ করুন
- প্রতিটি row target-এ, একইভাবে nums2-এ যোগ করুন
- ret := infinity
- প্রতিটি num nums1-এ,
- cts := nums1-এ ভিন্ন উপাদানların ফ্রিকোয়েন্সি ম্যাপ
- cts[num]--
- my_xor := num XOR nums2[0]
- i = 1 থেকে nums2 আকার পর্যন্ত,
- needed := my_xor XOR nums2[i]
- যদি cts[needed] == 0, ব্রেক করুন
- cts[needed]--
- ret = min(ret, my_xor-এ সেট বিট সংখ্যা)
- ret ফেরত দিন যদি ret != infinity, অন্যথায় -1
উদাহরণ
class Solution:
def solve(self, matrix, target):
nums1 = []
nums2 = []
for row in matrix:
ths = 0
while row:
ths = (ths<<1) + row.pop()
nums1.append(ths)
for row in target:
ths = 0
while row:
ths = (ths<<1) + row.pop()
nums2.append(ths)
ret=float('inf')
from collections import Counter
for num in nums1:
cts = Counter(nums1)
cts[num] -= 1
my_xor = num^nums2[0]
for i in range(1,len(nums2)):
needed = my_xor^nums2[i]
if not cts[needed]:
break
cts[needed]-=1
else:
ret=min(ret,bin(my_xor).count('1'))
return ret if ret!=float('inf') else -1
ob = Solution()
M = [[0, 0],[1, 0],[1, 1]]
T = [[0, 1],[1, 0],[1, 1]]
print(ob.solve(M,T))ইনপুট
M = [[0, 0],[1, 0],[1, 1]] T = [[0, 1],[1, 0],[1, 1]]
আউটপুট
1