একটি নন-ডিক্রিজিং অর্ডারে সাজানো লিস্ট nums দেওয়া আছে। আমাদের যাচাই করতে হবে কি এই লিস্টকে যেকোনো সংখ্যক সাবসিকোয়েন্সে ভাগ করা যায় যাতে প্রতিটি সাবসিকোয়েন্সের দৈর্ঘ্য কমপক্ষে ৩ এবং সেটি কনsekutিভ ইনক্রিজিং (যেমন ২,৩,৪)।
উদাহরণস্বরূপ, nums = [2, 3, 4, 4, 5, 6, 7] হলে আউটপুট True, কারণ [2,3,4] এবং [4,5,6,7]-এ ভাগ করা যায়।
সমাধানের পদ্ধতি (গ্রিডি + ফ্রিকোয়েন্সি কাউন্ট)
counts= প্রতিটি সংখ্যার ফ্রিকোয়েন্সি (Counter)।starts,ends= দুটি লিস্ট।- সর্টেড ইউনিক ভ্যালু
xএর জন্য:- যদি
count[x] > count[x-1], তবে(count[x] - count[x-1])টি নতুন সিকোয়েন্সx-এ শুরু হয় →starts-এ যোগ করুন। - যদি
count[x] > count[x+1], তবে(count[x] - count[x+1])টি সিকোয়েন্সx-এ শেষ হয় →ends-এ যোগ করুন।
- যদি
- সব
(start, end)পেয়ারের জন্যstart + 2 <= end(দৈর্ঘ্য ≥ ৩) কিনা চেক করুন। সবই সঠিক হলেTrue, অন্যথায়False।
পাইথন কোড উদাহরণ
from collections import Counter
class Solution:
def solve(self, nums):
count = Counter(nums)
starts = []
ends = []
for x in sorted(count):
if count[x] > count[x-1]:
starts.extend([x] * (count[x] - count[x-1]))
if count[x] > count[x+1]:
ends.extend([x] * (count[x] - count[x+1]))
return all(s + 2 <= e for s, e in zip(starts, ends))
ob = Solution()
nums = [2, 3, 4, 4, 5, 6, 7]
print(ob.solve(nums))
ইনপুট
[2, 3, 4, 4, 5, 6, 7]
আউটপুট
True