मान लीजिए हमारे पास nums नामक संख्याओं की एक लिस्ट है जो नॉन-डिक्रीजिंग क्रम में सॉर्ट है, हमें चेक करना है कि क्या इसे किसी भी संख्या में सबसीक्वेंस में विभाजित किया जा सकता है जैसे कि प्रत्येक सबसीक्वेंस की न्यूनतम लंबाई 3 हो और वह लगातार बढ़ती हो।
उदाहरण के लिए, यदि इनपुट nums = [2, 3, 4, 4, 5, 6, 7] है, तो आउटपुट True होगा, क्योंकि हम लिस्ट को [2, 3, 4] और [4, 5, 6, 7] में विभाजित कर सकते हैं।
समाधान दृष्टिकोण
इस समस्या को हल करने के लिए हम आवृत्ति गिनती और प्रारंभ/अंत बिंदुओं को ट्रैक करेंगे:
- counts := nums के तत्वों और उनकी गिनती वाला मैप
- starts := नई लिस्ट, ends := नई लिस्ट
- counts के आइटम्स को सॉर्ट क्रम में प्रत्येक 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))इनपुट
[6, 7, 5, 10, 13], 2
आउटपुट
True