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

पायथन में ऐरे से न्यूनतम हटाकर GCD बढ़ाएं


मान लीजिए हमारे पास N संख्याओं की एक सूची है। हमें वह न्यूनतम संख्या ढूंढनी है जिन्हें हटाने के बाद शेष संख्याओं का GCD, मूल N संख्याओं के प्रारंभिक GCD से बड़ा हो जाए।

इसलिए, यदि इनपुट [6, 9, 15, 30] है, तो आउटपुट 2 होगा क्योंकि प्रारंभिक GCD 3 है, और 6 और 9 को हटाने के बाद GCD 15 हो जाता है, जो 3 से बड़ा है।

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

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

  • INF := 100001
  • spf := [0, 1, ..., INF] (सबसे छोटा अभाज्य गुणनखंड सरणी)।
  • sieve() फ़ंक्शन परिभाषित करें:
    • i को 4 से INF तक 2 से बढ़ाते हुए: spf[i] := 2
    • i को 3 से INF तक के लिए:
      • यदि i² > INF, तो ब्रेक करें।
      • यदि spf[i] == i, तो:
        • j को 2*i से INF तक i से बढ़ाते हुए:
          • यदि spf[j] == j, तो spf[j] := i
  • calc_fact(x) फ़ंक्शन परिभाषित करें:
    • ret := []
    • जब तक x != 1:
      • ret.append(spf[x])
      • x := x // spf[x]
    • ret लौटाएं।
  • मुख्य विधि से:
    • g := 0
    • i को 0 से n-1 तक: g := gcd(a[i], g)
    • my_map := {}
    • i को 0 से n-1 तक: a[i] := a[i] // g
    • i को 0 से n-1 तक:
      • p := calc_fact(a[i])
      • s := {}
      • j को 0 से len(p)-1 तक: s[p[j]] := 1
      • s में प्रत्येक i के लिए: my_map[i] := my_map.get(i, 0) + 1
    • minimum := 10⁹
    • my_map में प्रत्येक i के लिए:
      • first := i, second := my_map[i]
      • यदि (n - second) <= minimum, तो minimum := n - second
    • यदि minimum != 10⁹, तो minimum लौटाएं।
    • अन्यथा, -1 लौटाएं।

उदाहरण

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

from math import gcd as __gcd

INF = 100001
spf = [i for i in range(INF)]

def sieve():
    for i in range(4, INF, 2):
        spf[i] = 2
    for i in range(3, INF):
        if i ** 2 > INF:
            break
        if spf[i] == i:
            for j in range(2 * i, INF, i):
                if spf[j] == j:
                    spf[j] = i

def calc_fact(x):
    ret = []
    while x != 1:
        ret.append(spf[x])
        x = x // spf[x]
    return ret

def minRemove(a, n):
    g = 0
    for i in range(n):
        g = __gcd(a[i], g)
    my_map = {}
    for i in range(n):
        a[i] = a[i] // g
    for i in range(n):
        p = calc_fact(a[i])
        s = {}
        for j in range(len(p)):
            s[p[j]] = 1
        for i in s:
            my_map[i] = my_map.get(i, 0) + 1
    minimum = 10 ** 9
    for i in my_map:
        first = i
        second = my_map[i]
        if (n - second) <= minimum:
            minimum = n - second
    if minimum != 10 ** 9:
        return minimum
    else:
        return -1

a = [6, 9, 15, 30]
n = len(a)
sieve()
print(minRemove(a, n))

इनपुट

[6, 9, 15, 30], 4

आउटपुट

2
  1. - पायथन में सबस्ट्रिंग से पालिंड्रोम बना सकते हैं

    मान लीजिए हमारे पास एक स्ट्रिंग s है, हमें s के सबस्ट्रिंग्स पर क्वेरीज़ करनी हैं। प्रत्येक क्वेरी queries[i] के लिए, तीन भाग हैं [left, right, k], हम सबस्ट्रिंग s[left], ..., s[right] को पुनर्व्यवस्थित कर सकते हैं, और फिर उनमें से k तक को किसी भी लोअरकेस अंग्रेजी अक्षर से बदल सकते हैं। यदि उपरोक्त

  1. - पायथन में ऐरे को जिगजैग बनाने के लिए एलिमेंट्स घटाएं

    मान लीजिए हमारे पास पूर्णांकों का एक ऐरे nums है, एक मूव ऑपरेशन वास्तव में किसी भी एलिमेंट को चुनना और इसे 1 से घटाना है। एक ऐरे A एक जिगजैग ऐरे है यदि या तो 1 या 2 संतुष्ट होता है - A[1] A[3] ... और इसी तरह।प्रत्येक ऑड-इंडेक्स्ड एलिमेंट आसन्न एलिमेंट्स से बड़ा है, इसलिए A[0] A[2] A[4] < ... और

  1. - पायथन में क्रमबद्ध सरणी से डुप्लिकेट हटाएं

    मान लीजिए हमारे पास एक क्रमबद्ध सूची A है। हमें सभी डुप्लिकेट प्रविष्टियों को हटाने के बाद सरणी की लंबाई वापस करनी है। हमें इसे O(1) अतिरिक्त स्थान में करना है। इसलिए हमें इन-प्लेस ऑपरेशन करना होगा। उदाहरण के लिए, मान लीजिए A = [1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6] तो आउटपुट 6 होगा, क्योंकि छह