日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不重复打印排序数组中相加和为给定值的所有二元组和三元组

發布時間:2025/4/5 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不重复打印排序数组中相加和为给定值的所有二元组和三元组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

  給定排序數組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)。

def printUniquePair(arr,k):if arr == None or len(arr) < 2:returnleft = 0right = len(arr) - 1while left < right:if arr[left] + arr[right] < k:left +=1elif arr[left] + arr[right] > k:right -=1else:if left == 0 or arr[left-1] != arr[left]:print(str(arr[left-1]) + ',' + str(arr[left]))left +=1right-=1

打印三元組的方法類似。只需要提前確定第一個元素(假設為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位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的不重复打印排序数组中相加和为给定值的所有二元组和三元组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。