題目描述
輸入乙個遞增排序的陣列和乙個數字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...