আমাদের একটি বাইনারি অ্যারে nums এবং একটি মান k আছে। এক মুভে, আমরা দুটি এডজেসেন্ট ইন্ডেক্স সিলেক্ট করে তাদের মান সোয়াপ করতে পারি। আমাদের ন্যূনতম মুভ সংখ্যা বের করতে হবে যাতে nums-এ kটি কনsekutিভ 1 থাকে।
উদাহরণস্বরূপ, ইনপুট nums = [1,0,0,1,0,1,0,1], k = 3 হলে আউটপুট হবে 2 কারণ এক সোয়াপে অ্যারে [1,0,0,1,0,1,0,1] থেকে [1,0,0,0,1,1,0,1] হবে, তারপর [1,0,0,0,1,1,1,0]।
সমাধানের ধাপসমূহ (স্লাইডিং উইন্ডো + মিডিয়ান)
j := 0, val := 0, ans := 999999, loc := একটি নতুন লিস্টnums-এর প্রতিটি ইন্ডেক্সiএবং ভ্যালুxএর জন্য:যদি
x != 0হয়, তবে:i-কেloc-এর শেষে যোগ করুনm := (j + len(loc) - 1) // 2val += loc[-1] - loc[m] - (len(loc) - j) // 2যদি
len(loc) - j > kহয়, তবে:m := (j + len(loc)) // 2val -= loc[m] - loc[j] - (len(loc) - j) // 2j := j + 1
যদি
len(loc) - j == kহয়, তবে:ans := min(ans, val)
ansরিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:
def solve(nums, k):
j = val = 0
ans = 999999
loc = []
for i, x in enumerate(nums):
if x:
loc.append(i)
m = (j + len(loc) - 1) // 2
val += loc[-1] - loc[m] - (len(loc) - j) // 2
if len(loc) - j > k:
m = (j + len(loc)) // 2
val -= loc[m] - loc[j] - (len(loc) - j) // 2
j += 1
if len(loc) - j == k:
ans = min(ans, val)
return ans
nums = [1,0,0,1,0,1,0,1]
k = 3
print(solve(nums, k)) ইনপুট
[1,0,0,1,0,1,0,1], 3
আউটপুট
2