[劍指offer] 和為S的兩個(gè)數(shù)字

本文首發(fā)于我的個(gè)人博客:尾尾部落

題目描述

輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字S帆竹,在數(shù)組中查找兩個(gè)數(shù)绕娘,使得他們的和正好是S,如果有多對數(shù)字的和等于S栽连,輸出兩個(gè)數(shù)的乘積最小的险领。

解題思路

法一:哈希法。用一個(gè)HashMap秒紧,它的 key 存儲(chǔ)數(shù)S與數(shù)組中每個(gè)數(shù)的差绢陌,value 存儲(chǔ)當(dāng)前的數(shù)字,比較S=15, 當(dāng)前的數(shù)為 4熔恢,則往 hashmap 中插入(key=11, value=4)脐湾。我們遍歷數(shù)組,判斷hashmap 中的 key 是否存在當(dāng)前的數(shù)字绩聘,如果存在沥割,說明存在著另一個(gè)數(shù)與當(dāng)前的數(shù)相加和為 S耗啦,我們就可以判斷它們的乘積是否小于之前的乘積凿菩,如果小的話就替換之前的找到的數(shù)字,如果大就放棄當(dāng)前找到的帜讲。如果hashmap 中的 key 不存在當(dāng)前的數(shù)字衅谷,說明還沒有找到相加和為 S 的兩個(gè)數(shù),那就把S與當(dāng)前數(shù)字的差作為 key似将,當(dāng)前數(shù)字作為 value 插入到 hashmap 中获黔,繼續(xù)遍歷蚀苛。

法二:左右夾逼的方法。a+b=sum玷氏,a和b越遠(yuǎn)乘積越小堵未,因?yàn)閿?shù)組是遞增排序,所以一頭一尾兩個(gè)指針往內(nèi)靠近的方法找到的就是乘積最小的情況盏触。
若ai + aj == sum渗蟹,就是答案(相差越遠(yuǎn)乘積越小)
若ai + aj > sum赞辩,說明 aj 太大了雌芽,j --
若ai + aj < sum,說明 ai 太小了辨嗽,i ++

參考代碼

import java.util.ArrayList;
import java.util.HashMap;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(array.length < 2)
            return res;
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        int less = Integer.MAX_VALUE;
        for(int i = 0; i < array.length; i++){
            if(map.containsKey(array[i])){
                if(array[i] * map.get(array[i]) < less){
                    less = array[i] * map.get(array[i]);
                    res.clear();
                    res.add(map.get(array[i]));
                    res.add(array[i]);
                }
            }else{
                int key = sum - array[i];
                map.put(key, array[i]);
            }
        }
        return res;
    }
}

法二:左右夾逼

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(array.length < 2)
            return res;
        int i = 0, j = array.length - 1;
        while(i != j){
            if(array[i] + array[j] == sum){
                res.add(array[i]);
                res.add(array[j]);
                break;
            }else if(array[i] + array[j] < sum){
                i++;
            }else{
                j--;
            }
        }
        return res;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末世落,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糟需,更是在濱河造成了極大的恐慌屉佳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮灼,死亡現(xiàn)場離奇詭異忘古,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诅诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門髓堪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娘荡,你說我怎么就攤上這事干旁。” “怎么了炮沐?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵争群,是天一觀的道長。 經(jīng)常有香客問我大年,道長换薄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任翔试,我火速辦了婚禮轻要,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垦缅。我一直安慰自己冲泥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凡恍,像睡著了一般志秃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚼酝,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天浮还,我揣著相機(jī)與錄音,去河邊找鬼闽巩。 笑死碑定,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的又官。 我是一名探鬼主播延刘,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼六敬!你這毒婦竟也來了碘赖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤外构,失蹤者是張志新(化名)和其女友劉穎普泡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體审编,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撼班,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垒酬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰嘁。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勘究,靈堂內(nèi)的尸體忽然破棺而出矮湘,到底是詐尸還是另有隱情,我是刑警寧澤口糕,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布缅阳,位于F島的核電站,受9級特大地震影響景描,放射性物質(zhì)發(fā)生泄漏十办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一超棺、第九天 我趴在偏房一處隱蔽的房頂上張望向族。 院中可真熱鬧,春花似錦说搅、人聲如沸炸枣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽适肠。三九已至,卻和暖如春候引,著一層夾襖步出監(jiān)牢的瞬間侯养,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工澄干, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逛揩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓麸俘,卻偏偏與公主長得像辩稽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子从媚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)逞泄。 張土汪:刷leetcod...
    土汪閱讀 12,737評論 0 33
  • 題目描述 輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字S,在數(shù)組中查找兩個(gè)數(shù)拜效,是的他們的和正好是S喷众,如果有多對數(shù)字的和等于S,...
    夏臻Rock閱讀 455評論 0 0
  • 有一項(xiàng)調(diào)查顯示紧憾,職位越高到千,工作壓力越大的人越容易脫發(fā)。事實(shí)上現(xiàn)實(shí)生活中年紀(jì)輕輕赴穗,甚至只有20來歲就“禿頂”的人也是...
    發(fā)友邦閱讀 184評論 0 0
  • 文/朱俊丞 自從被狐貍騙走了到嘴的一塊肉以后憔四,烏鴉一直都很后悔。有一天般眉,烏鴉又得到了一塊肉加矛。當(dāng)她在一棵大樹上歇腳的...
    王了一一閱讀 272評論 11 12
  • 你是不是一直在努力著斟览?你讀了那么多書,聽了那么多牛人的課程和演講辑奈,付了那么多錢去買各種各樣的知識苛茂,可感覺自己還是老...
    淡之閱讀 1,680評論 3 19