和為s且乘積最小的兩個數(shù)字

題目描述

輸入一個遞增排序的數(shù)組和一個數(shù)字S,在數(shù)組中查找兩個數(shù),使得他們的和正好是S,如果有多對數(shù)字的和等于S,輸出兩個數(shù)的乘積最小的。
輸出描述:
對應(yīng)每個測試案例,輸出兩個數(shù),小的先輸出。

解題思路一:參考two sum問題,該方法時間復(fù)雜度為O(n),空間復(fù)雜度為O(n),代碼有寫冗長。思路二代碼較為簡單。
# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        adict = {}
        res_truple = []
        for i in range(len(array)):
            target = tsum - array[i]
            if adict.get(target) is not None:
                res_truple.append([target,array[i]])
            else:
                adict[array[i]] = 1

        if len(res_truple)==0:
            return []

        product = res_truple[0][0]*res_truple[0][1]
        small = min(res_truple[0][0],res_truple[0][1])
        big = max(res_truple[0][0],res_truple[0][1])

        for i in range(1,len(res_truple)):
            if product>res_truple[i][0]*res_truple[i][1]:
                product = res_truple[i][0]*res_truple[i][1]
                small = min(res_truple[i][0], res_truple[i][1])
                big = max(res_truple[i][0], res_truple[i][1])
                
        return [small,big]
解題思路二:

0.注意該數(shù)組為一個遞增有序的數(shù)組
1.設(shè)定兩個指針p和q,開始時分別指向array[0]和array[-1]
2.當(dāng)p和q兩個指針對應(yīng)位置的值之和s大于tsum時,q-=1
3.當(dāng)p和q兩個指針對應(yīng)位置的值之和s小于tsum時,p+=1
4.通過該方法首次找到的一對就是乘積最小的那一對。

證明如下:

假設(shè)找到的是[x,y]。那么有x+y=s_0,y-x=d>=0,
于是有:x+y = x+(x+d)=2x+d=s_0
于是有:x=\frac{s_0-d}{2}
于是有:x*y = x*(x+d)=x^2+x*d =(\frac{s_0-d}{2})^2+\frac{s_0-d}{2}*d=\frac{s_0^2-d^2}{4}
我們發(fā)現(xiàn)x*y是一個遍歷為d的二次函數(shù),對稱軸為Y軸,頂點為(0,\frac{s_0^2}{4}),開口向下,在d>=0的情況下,隨著d的增加而減小。而首次找到的那一對d最大。

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        #0.注意該數(shù)組為一個遞增有序的數(shù)組
        #1.設(shè)定兩個指針p和q,開始時分別指向array[0]和array[-1]
        #2.當(dāng)p和q兩個指針對應(yīng)位置的值之和s大于tsum時,q-=1
        #3.當(dāng)p和q兩個指針對應(yīng)位置的值之和s小于tsum時,p+=1
        p = 0
        q = len(array)-1
        while p<q:
            s = array[p] + array[q]
            if s>tsum:
                q -= 1
            elif s<tsum:
                p += 1
            elif s == tsum:
                return [array[p],array[q]]
        return []
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 9月21日消息,助力夢想·加速創(chuàng)業(yè)——由網(wǎng)易主辦、唯你網(wǎng)承辦的“2017網(wǎng)易中國創(chuàng)業(yè)家大賽”廈門賽區(qū)總決賽今日下午...
    霓墨閱讀 315評論 0 0
  • ‘我心有不甘,我不努力而已,我若是努力,豈有不成功的'。我每次失敗都是這么安慰自己?,F(xiàn)在我才明白,即使我當(dāng)初努力了...
    放下手機立地成賢閱讀 843評論 0 0
  • 2017年8月6日 丁酉年閏六月十五 星期日 2016年10月30日始讀經(jīng),系統(tǒng)讀經(jīng)40周,系統(tǒng)讀經(jīng)280天? 讀...
    菜問媽媽閱讀 293評論 0 0
  • 前幾天聽了五月天9號作品的第二首歌《如果我們不曾相遇》,老實說第一遍聽,覺得難聽死了,哈哈哈哈~這是我曾經(jīng)認(rèn)識的那...
    橘子醬666閱讀 4,967評論 4 5

友情鏈接更多精彩內(nèi)容