求數組中兩兩相加等於20的組合(Python實現)
阿新 • • 發佈:2018-10-29
def n+1 odi lse java程序員 urn nlogn end 數組
題目
求數組中兩兩相加等於20的組合。
例:給定一個數組[1, 7, 17, 2, 6, 3, 14],這個數組中滿足條件的有兩對:17+3=20, 6+14=20。
解析
分為兩個步驟:
- 先采用堆排序或快速排序對數組進行排序,時間復雜度為O(nlogn)。
- 然後對排序的數組分別從前到後和從後到前進行遍歷, 時間復雜度為O(n)。
假設從前到後遍歷的下標為begin,從後到前遍歷的下標為end。
- 當arr[begin] + arr[end] < 20時,滿足條件的數一定在[begin+1, end]之間;
- 當arr[begin] + arr[end] > 20時,滿足條件的數一定在[begin, end-1]之間;
- 當arr[begin] + arr[end] = 20時,找到一組符合條件的數,剩下的組合一定在[begin-1, end-1]之間。
整個算法的時間復雜度為O(nlogn)
。
Python實現
# -*- coding:utf-8 -*- def quick_sort(arr, left, right): """快速排序""" if left >= right: return low = left high = right p = arr[left] while left < right: while left < right and arr[right] >= p: right -= 1 arr[left] = arr[right] while left < right and arr[left] <= p: left += 1 arr[right] = arr[left] arr[left] = p quick_sort(arr, low, left-1) quick_sort(arr, left+1, high) def find_sum(arr, sum): """尋找數組中相加等於sum的組合""" quick_sort(arr, 0, len(arr) - 1) begin, end = 0, len(arr) - 1 while begin < end: if arr[begin] + arr[end] < sum: begin += 1 elif arr[begin] + arr[end] > sum: end -= 1 else: print(‘%s %s‘ % (arr[begin], arr[end])) begin += 1 end -= 1 if __name__ == ‘__main__‘: arr = [1, 7, 17, 2, 6, 3, 14] find_sum(arr, 20)
參考資料
- 《Java程序員面試筆試寶典》
求數組中兩兩相加等於20的組合(Python實現)