和為S的兩個數字

2021-08-19 02:31:21 字數 1635 閱讀 1668

題目描述

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。

輸出描述:

對應每個測試案例,輸出兩個數,小的先輸出。

解題思路:

首先,積最小即兩個數相距最遠,即兩者中小的那個數在所有可能性中最小。

舉例:和為6。可能為(1,5),(2,4),(3,3),積最小的為(1,5)。

由於剛寫完上面乙個和為s的連續正數序列,想到利用兩個指標,求和,和小於sum的high++,和大於sum的low++。

但是這樣會存在乙個問題,如[1,2,4,7,11,15],找15,low指向1,high指向15,low會一直自加,但其實low指向4,high指向11滿足條件。所以當和》sum的時候,我們讓low++,high–。這樣就不會出現這種情況了。

越界舉例:如[1,2,4,7,11,16],找10,按照如上情況最後一次low會指向4,high指向7,和大於sum,low和high改變,不滿足low

class

solution:

deffindnumberswithsum

(self, array, tsum):

# write code here

ifnot array: return

low = 0

high = 1

while low < high and high if array[low] + array[high] < tsum:

high+=1

elif array[low] + array[high] > tsum:

low+=1

high-=1

else:

return array[low],array[high]

else:

return

print(solution().findnumberswithsum([1,2,4,7,11,15],15))

print(solution().findnumberswithsum([1,2,4,7,11,16],10))

解題思路二:

上面那種解法不夠一目了然。

不如讓乙個指標指向最低位,乙個指向最高位,然後往中間夾逼,碰到的第乙個就是答案(因為相距最遠)。

class

solution:

deffindnumberswithsum

(self, array, tsum):

# write code here

ifnot array: return

low = 0

high = len(array)-1

while low < high :

if array[low] + array[high] < tsum:

low+=1

elif array[low] + array[high] > tsum:

high-=1

else:

return array[low],array[high]

else:

return

和為S的兩個數字

題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸入 每個測試案例包括兩行 第一行包含乙個整數n和k,n表示陣列中的元素個數,k表示兩數之和。其中1 n 10 6,k為int 第二行包含n個整數,每個陣列均為i...

和為S的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。class solution public vectorfindnumberswithsum vectorarray,i...

和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。include using namespace std bool twonumberwithsum int data,i...