Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में निकटतम सबसीक्वेंस योग खोजने का प्रोग्राम


मान लीजिए हमारे पास एक सरणी nums और एक अन्य मान goal है। हम nums का एक सबसीक्वेंस चुनना चाहते हैं ताकि उसके तत्वों का योग goal के निकटतम हो। दूसरे शब्दों में, यदि सबसीक्वेंस के तत्वों का योग s है, तो हम निरपेक्ष अंतर |s - goal| को न्यूनतम करना चाहते हैं।

तो हमें |s - goal| का न्यूनतम संभव मान ढूंढना है। उदाहरण के लिए, यदि इनपुट है nums = [8,-8,16,-1] goal = -3, तो आउटपुट 2 होगा क्योंकि सबसीक्वेंस [8,-8,-1] चुनें, जिसका योग -1 है। निरपेक्ष अंतर है |-1 - (-3)| = abs(2) = 2, यह न्यूनतम है।

समाधान दृष्टिकोण

इस समस्या को हल करने के लिए हम निम्न चरणों का पालन करेंगे:

  • n := nums का आकार

  • nums को x के निरपेक्ष मान के नकारात्मक मान के आधार पर सॉर्ट करें

  • neg := n+1 आकार की एक सरणी बनाएं और 0 से भरें

  • pos := n+1 आकार की एक सरणी बनाएं और 0 से भरें

  • i के लिए n-1 से 0 तक घटाते हुए लूप चलाएं

    • यदि nums[i] < 0, तो

      • neg[i] := neg[i+1] + nums[i]

      • pos[i] := pos[i+1]

    • अन्यथा,

      • pos[i] := pos[i+1] + nums[i]

      • neg[i] := neg[i+1]

  • ans := |goal|

  • s := एक नया सेट और इसमें 0 डालें

  • check() फंक्शन परिभाषित करें। यह a, b लेगा

  • यदि b < goal - ans या goal + ans < a, तो False लौटाएं

  • True लौटाएं

  • मुख्य विधि से, निम्न करें

  • i के लिए 0 से n-1 तक लूप चलाएं

    • sl := s में सभी x की सूची जब check(x+neg[i], x+pos[i] सत्य है]

    • यदि sl का आकार 0 के बराबर है, तो लूप से बाहर निकलें

    • s := sl से एक नया सेट

    • sl में प्रत्येक x के लिए

      • y := x + nums[i]

      • यदि |y - goal| < ans, तो ans := |y - goal|

      • यदि ans, 0 के बराबर है, तो 0 लौटाएं

      • y को s में डालें

  • ans लौटाएं

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

from collections import Counter
def solve(nums, goal):
    n = len(nums)
    nums.sort(key=lambda x: -abs(x))
    neg = [0 for _ in range(n+1)]
    pos = [0 for _ in range(n+1)]
    for i in range(n-1, -1, -1):
        if nums[i] < 0:
            neg[i] = neg[i+1] + nums[i]
            pos[i] = pos[i+1]
        else:
            pos[i] = pos[i+1] + nums[i]
            neg[i] = neg[i+1]
    ans = abs(goal)
    s = set([0])
    def check(a, b):
        if b < goal - ans or goal + ans < a:
            return False
        return True
    for i in range(n):
        sl = [x for x in s if check(x+neg[i], x+pos[i])]
        if len(sl) == 0:
            break
        s = set(sl)
        for x in sl:
            y = x + nums[i]
            if abs(y - goal) < ans:
                ans = abs(y - goal)
            if ans == 0:
                return 0
            s.add(y)
    return ans

nums = [8,-8,16,-1]
goal = -3
print(solve(nums, goal))

इनपुट

[0,1,2,3,4], [[3,1],[1,3],[5,6]]

आउटपुट

2
  1. पायथन प्रोग्राम: लिस्ट का संचयी योग ज्ञात करें पायथन प्रोग्राम: लिस्ट का संचयी योग ज्ञात करें

    इस लेख में हम दी गई समस्या के समाधान के बारे में जानेंगे। समस्या कथन हमें एक लिस्ट दी गई है, हमें संचयी योग के साथ एक लिस्ट बनानी है। उदाहरण # संचयी योग def Cumulative(l): new = [] cumsum = 0 for element in l: cumsum += element new.append(cumsum) return new # ड्राइवर

  1. पायथन प्रोग्राम: लिस्ट में एलिमेंट्स का योग ढूंढें पायथन प्रोग्राम: लिस्ट में एलिमेंट्स का योग ढूंढें

    इस लेख में, हम दिए गए प्रॉब्लम स्टेटमेंट को हल करने के समाधान और दृष्टिकोण के बारे में सीखेंगे। प्रॉब्लम स्टेटमेंट इनपुट के रूप में एक लिस्ट दिए जाने पर, हमें दी गई लिस्ट का योग निकालने की आवश्यकता है। यहां हमारे पास दो दृष्टिकोण हैं: बिल्ट-इन फंक्शन का उपयोग करना और ब्रूट-फोर्स दृष्टिकोण का उपयोग

  1. पायथन प्रोग्राम: ऐरे का योग ढूंढें पायथन प्रोग्राम: ऐरे का योग ढूंढें

    इस लेख में, हम दिए गए प्रॉब्लम स्टेटमेंट को हल करने के समाधान और दृष्टिकोण के बारे में सीखेंगे। प्रॉब्लम स्टेटमेंट इनपुट के रूप में एक ऐरे दिए जाने पर, हमें दिए गए ऐरे का योग निकालने की आवश्यकता है। यहां हम ब्रूट-फोर्स दृष्टिकोण का पालन कर सकते हैं यानी एक लिस्ट को ट्रैवर्स करना और प्रत्येक एलिमें