不重复打印排序数组中相加和为给定值的所有二元组和三元组
題目
給定排序數組arr和整數k,不重復打印arr中所有相加和為k的不降序二元組。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 10,打印結果為:1,9 2,8
補充題目
給定排序數組arr和整數k,不重復打印arr中所有相加和為k的不降序三元組。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 10,打印結果為: -4, 5, 9 -3, 4, 9 ?-3, 5, 8 ?0, 1, 9 ?0, 2, 8 ?1, 4, 5
基本思路
利用排序后數組的特點,可以設置兩個指針left和right,left從左邊開始移動,right從右邊開始移動。初始時 left = 0,right = len(arr) - 1。之后比較 arr[left] + arr[right] 和 k ,情況如下:
如果arr[left] + arr[right] == k,滿足條件,將這個兩個元素打印出來
如果arr[left] + arr[right] < k,說明需要加一個更大的數,令left加1
如果arr[left] + arr[right] > k,說明需要加一個更小的數,令right減1
計算的過程中要判斷打印的元組之前是否打印過,只需要每次打印的時候檢查 arr[left] 是否等于 arr[left-1]。整個時間復雜度O(N)。
打印三元組的方法類似。只需要提前確定第一個元素(假設為a),剩下的兩個元素只需要按照打印二元組的方法找累加和為 k - a 的二元組。為了不重復打印,在確定第一個元素的時候也要判斷是否之前出現過。實現代碼如下:
def printUniqueTried(arr,k):if arr == None or len(arr) < 3:returnfor i in range(len(arr)):left = i + 1right = len(arr) - 1sum_ = arr[left] + arr[right]if sum_-arr[i] > k:right -= 1elif sum_-arr[i] < k:left += 1else:if left == i+1 or arr[left-1]!=arr[left]:print(str(arr[i])+','+ str(arr[left])+','+str(arr[right]))left +=1right -=1?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的不重复打印排序数组中相加和为给定值的所有二元组和三元组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最长的可整合子数组的长度
- 下一篇: 判断一个点是否在三角形内部