簡體   English   中英

如何在列表中找到所有等於 N 的對

[英]How find all pairs equal to N in a list

我對這個算法有疑問-我必須在列表中找到對:

[4, 8, 9, 0, 12, 1, 4, 2, 12, 12, 4, 4, 8, 11, 12, 0]

等於12 問題是,在配對之后,這些數字(元素)不能再次使用。

現在,我有你可以在下面找到的代碼。 我嘗試在匹配后從列表中刪除數字,但我覺得在此之后索引存在問題。

它看起來很容易,但仍然無法正常工作。 ;/

class Pairs():

    def __init__(self, sum, n, arr ):

        self.sum = sum
        self.n = n
        self.arr = arr

    def find_pairs(self):

        self.n = len(self.arr)

        for i in range(0, self.n):
            for j in range(i+1, self.n):
                if (self.arr[i] + self.arr[j] == self.sum):
                    print("[", self.arr[i], ",", " ", self.arr[j], "]", sep = "")
                    self.arr.pop(i)
                    self.arr.pop(j-1)
                    self.n = len(self.arr)
                    i+=1


def Main():
    sum = 12
    arr = [4, 8, 9, 0, 12, 1, 4, 2, 12, 12, 4, 4, 8, 11, 12, 0]
    n = len(arr)
    obj_Pairs = Pairs(sum, n, arr)
    obj_Pairs.find_pairs()

if __name__ == "__main__":
    Main()

更新:

謝謝你們的快速回答!

我已經嘗試了您的解決方案,不幸的是,它仍然不是我想要的。 我知道預期的 output 應該是這樣的:[4, 8], [0, 12], [1, 11], [4, 8], [12, 0]。 因此,在您的第一個解決方案中,重復元素仍然存在問題,而在第二個解決方案中,缺少 [4, 8] 和 [12, 0]。 很抱歉一開始沒有給 output。

對於這個問題,您需要跟蹤已經嘗試過的數字。 Python 有一個計數器class 將保存給定列表中存在的每個元素的計數。

我會使用的算法是:

  • 在列表中創建元素計數器
  • 迭代列表
    • 對於每個元素,檢查 (target - element) 是否存在於計數器中,並且該項目的計數 > 0
      • 減少元素的計數和(目標 - 元素)

from collections import Counter

class Pairs():
    def __init__(self, target, arr):
        self.target = target
        self.arr = arr

    def find_pairs(self):
        count_dict = Counter(self.arr)
        result = []
        for num in self.arr:
            if count_dict[num] > 0:
                difference = self.target - num
                if difference in count_dict and count_dict[difference] > 0:
                    result.append([num, difference])
                    count_dict[num] -= 1
                    count_dict[difference] -= 1
        return result

if __name__ == "__main__":
    arr = [4, 8, 9, 0, 12, 1, 4, 2, 12, 12, 4, 4, 8, 11, 12, 0]
    obj_Pairs = Pairs(12, arr)
    result = obj_Pairs.find_pairs()
    print(result)

Output:

[[4, 8], [8, 4], [0, 12], [12, 0], [1, 11]]

演示

要修復您的代碼 - 幾句話:

  1. 如果您在for循環中迭代數組,則不應更改它 - 如果您想修改底層列表,請使用while循環(您可以重寫此解決方案以使用while循環)

  2. 因為您只迭代外循環中的元素一次 - 您只需要確保您“彈出”內循環中的元素。

所以代碼:

class Pairs():

    def __init__(self, sum, arr ):
        self.sum = sum
        self.arr = arr
        self.n = len(arr)
    
    def find_pairs(self):
        j_pop = []
        for i in range(0, self.n):
            for j in range(i+1, self.n):
                if (self.arr[i] + self.arr[j] == self.sum) and (j not in j_pop):
                    print("[", self.arr[i], ",", " ", self.arr[j], "]", sep = "")
                    j_pop.append(j)
                                    
def Main():
    sum = 12
    arr = [4, 8, 9, 0, 12, 1, 4, 2, 12, 12, 4, 4, 8, 11, 12, 0]
    obj_Pairs = Pairs(sum, arr)
    obj_Pairs.find_pairs()

if __name__ == "__main__":
    Main()

簡短的

如果您了解哈希圖和鏈表/雙端隊列,您可以考慮使用輔助空間將 map 值添加到它們的索引中。

臨:

  • 它確實使時間復雜度線性化。
  • 不修改輸入

缺點:

  • 使用額外空間
  • 使用與原始策略不同的策略。 如果這是針對 class 並且您還沒有了解應用的數據結構,請不要使用它。

代碼

from collections import deque # two-ended linked list

class Pairs():

    def __init__(self, sum, n, arr ):

        self.sum = sum
        self.n = n
        self.arr = arr

    def find_pairs(self):
        mp = {}  # take advantage of a map of values to their indices
        res = [] # resultant pair list
        for idx, elm in enumerate(self.arr):
            if mp.get(elm, None) is None:
                mp[elm] = deque() # index list is actually a two-ended linked list

            mp[elm].append(idx) # insert this element
            comp_elm = self.sum - elm # value that matches
            if mp.get(comp_elm, None) is not None and mp[comp_elm]: # there is no match
                # match left->right
                res.append((comp_elm, elm))
                mp[comp_elm].popleft()
                mp[elm].pop()

        for pair in res: # Display
            print("[", pair[0], ",", " ", pair[1], "]", sep = "")

        # in case you want to do further processing
        return res

def Main():
    sum = 12
    arr = [4, 8, 9, 0, 12, 1, 4, 2, 12, 12, 4, 4, 8, 11, 12, 0]
    n = len(arr)
    obj_Pairs = Pairs(sum, n, arr)
    obj_Pairs.find_pairs()

if __name__ == "__main__":
    Main()

Output

$ python source.py
[4, 8]
[0, 12]
[4, 8]
[1, 11]
[12, 0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM