怎樣應(yīng)對IT面試與筆試-(六)

1.2 第二階段-常用算法技巧

第一階段主要是幫小伙伴們熟悉了基本的數(shù)據(jù)結(jié)構(gòu),第二階段我們的關(guān)注點(diǎn)在于怎么利用這些數(shù)據(jù)結(jié)構(gòu)去解決面試題目惩琉。這個過程中小伙伴們會看到一些常用的解題“套路”荷辕,學(xué)會這些“套路”會一定程度上提升你的解題效率。

  • Note 第二階段我們先出給代碼,再用實(shí)例去解釋,小伙伴們可以嘗試先自己閱讀分析下代碼喷舀,希望通過這階段學(xué)習(xí),能提升小伙伴們讀懂代碼的能力。

暴力搜索元咙,先排序(sort )和 哈希表Hash table(unordered_set)

217. Contains Duplicate

判斷一個整數(shù)數(shù)組是否包含重復(fù)元素梯影,包含返回true巫员,否則返回false

重新回憶下217的解題思路:
(1)題目要求尋找數(shù)組中的循環(huán)元素庶香,按照一般思路,我們自然會想到從數(shù)組第一個元素開始循環(huán)比較简识,窮舉情況來看是否有符合題目要求的組合赶掖。循環(huán)遍歷窮舉可能性這就是一種暴力搜索的算法思想。
(2)在優(yōu)化部分七扰,分析發(fā)現(xiàn)數(shù)組本身的無序?qū)е铝艘秒p重循環(huán)O(N^2)才能完成窮舉奢赂。如果數(shù)組是有序狀態(tài),那么窮舉可以在一遍循環(huán)O(N)就完成颈走,這樣就大大節(jié)省了搜索時間膳灶。所以在一些情況下,處理前先排序也是一種算法技巧立由,能提高暴力搜索的效率轧钓。
(3)現(xiàn)在我們介紹第三種做法,利用基于哈希表實(shí)現(xiàn)的unorderd_set容器來處理

  • C++ 11中對unordered_set描述大體如下:無序集合容器(unordered_set)是一個存儲唯一(unique锐膜,即無重復(fù))的關(guān)聯(lián)容器(Associative container)毕箍,容器中的元素?zé)o特別的秩序關(guān)系,該容器允許基于值的快速元素檢索道盏,同時也支持正向迭代而柑。
  • 在一個unordered_set內(nèi)部,元素不會按任何順序排序荷逞,而是通過元素值的hash值將元素分組放置到各個槽(Bucker媒咳,也可以譯為“桶”),這樣就能通過元素值快速訪問各個對應(yīng)的元素(均攤耗時為O(1))种远。
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        if(nums.size() <= 1)
            return false;
        unordered_set<int> temp;
        for(int i = 0; i < nums.size(); ++i)
        {
            //利用unordered_set的count方法可以判斷當(dāng)前元素是否已經(jīng)在容器中
            if(temp.count(nums[i]) != 0)
                return true;
            else
             //將元素放到容器中
                temp.insert(nums[i]);
        }
        
        return false;
    }
};

以5,6,7,6為例
(1)i=0時涩澡,temp中找不到5(nums[0),將5放到temp中
(2)i=1時院促,temp中找不到6筏养,temp中包含5,6
(3)i=2時,temp中找不到7常拓,temp中包含5,6,7
(4)i=3時渐溶,temp中找到了6,直接返回true

哈希表Hash table(unordered_map)

除了unordered_set弄抬,還有一種更為常用的基于哈希表的數(shù)據(jù)結(jié)構(gòu)unordered_map

  • 無序映射表(Unordered Map)容器是一個存儲以鍵值對組合而成的元素的關(guān)聯(lián)容器(Associative container)茎辐,容器中的元素?zé)o特別的次序關(guān)系。該容器允許基于主鍵地快速檢索各個元素。

1. Two Sum

給一個數(shù)組和一個目標(biāo)值target拖陆,要求在數(shù)組中找到兩個元素相加等于target弛槐,返回這兩個元素的下標(biāo)。我們可以假設(shè)每個數(shù)組只有一個解依啰。
例如:
nums = [2, 7, 11, 15], target = 9乎串,
nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

能直接想到的解題思路類似做過的217題目速警,可以用暴力搜索來解決:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> result;
        if(nums.size() < 2)
            return nums;
        for(int i=0; i < nums.size();++i)
        {
            for(int j=i+1; j < nums.size(); ++j)
            {
                if(nums[i] + nums[j] == target)
                {
                    result.push_back(j);
                    result.push_back(i);
                    return result;
                }
            }
        }
    }
};

來一起看下unordered_map解題思路叹誉。仍舊以2, 7, 11, 15(下標(biāo)依次為0,1,2,3)為例:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target)
{
    unordered_map<int, int> hash;
    vector<int> result;
    for (int i = 0; i < numbers.size(); i++) {
        int numberToFind = target - numbers[i];
        if (hash.count(numberToFind) != 0) {
            result.push_back(hash[numberToFind]);
            result.push_back(i);            
            return result;
        }
        hash[numbers[i]] = i;
    }
    return result;
}
};

(1)ordered_map中的key是數(shù)組中的元素,value是元素對應(yīng)的下標(biāo)闷旧,例如2是key长豁,0是value
(2)i = 0時候,numberToFind =9-2 = 7忙灼,hash里沒有key為7的元素匠襟,所以把鍵值對(2---0)放入hash
(3)i = 1時候,numberToFind = 9-7 = 2该园,hash里通過count方法查到有key為2的元素酸舍,并且知道2對應(yīng)的索引為0,至此把找到的索引放入vector中

Tow Pointers(輔助指針)

167. Two Sum II - Input array is sorted(類似題目還有141)

上面那道1.Tow Sum題目的衍生題目爬范,數(shù)組變?yōu)樯蚺帕懈竿螅页鰞蓚€元素和等于target,并返回元素的下標(biāo)(從1開始青瀑,而不是從0開始)璧亮,題中限定只有一個解。
例子:
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int l = 0, r = numbers.size() - 1;
        while (l < r) {
            int sum = numbers[l] + numbers[r];
            if (sum == target) return {l + 1, r + 1};
            else if (sum < target) ++l;
            else --r;
        }
        return {};
    }
};

以2,7,11,15為例
(1)l=0斥难,r=3枝嘶,sum=2+15=17,17>9哑诊,r=2
(2)l=0群扶,r=2,sum=2+11=13镀裤,13>9竞阐,r=1
(3)l=0,r=1暑劝,sum=2+7=9骆莹,9==9,return 0+1,1+1

怎樣應(yīng)對IT面試與筆試-(一)
怎樣應(yīng)對IT面試與筆試-(二)
怎樣應(yīng)對IT面試與筆試-(三)
怎樣應(yīng)對IT面試與筆試-(四)
怎樣應(yīng)對IT面試與筆試-(五)
怎樣應(yīng)對IT面試與筆試-(五-1)
怎樣應(yīng)對IT面試與筆試-(六)
怎樣應(yīng)對IT面試與筆試-(七)
怎樣應(yīng)對IT面試與筆試-(八)
怎樣應(yīng)對IT面試與筆試-(九)
怎樣應(yīng)對IT面試與筆試-(十)
怎樣應(yīng)對IT面試與筆試-(十一)
怎樣應(yīng)對IT面試與筆試-(十二)
怎樣應(yīng)對IT面試與筆試-(十三)
怎樣應(yīng)對IT面試與筆試-(十四)
怎樣應(yīng)對IT面試與筆試-(十五)
怎樣應(yīng)對IT面試與筆試-(十六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末担猛,一起剝皮案震驚了整個濱河市幕垦,隨后出現(xiàn)的幾起案子丢氢,更是在濱河造成了極大的恐慌,老刑警劉巖先改,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疚察,死亡現(xiàn)場離奇詭異,居然都是意外死亡仇奶,警方通過查閱死者的電腦和手機(jī)貌嫡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜嘱,“玉大人衅枫,你說我怎么就攤上這事嫁艇±柿妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵步咪,是天一觀的道長论皆。 經(jīng)常有香客問我冗懦,道長糜芳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任匾荆,我火速辦了婚禮悯周,結(jié)果婚禮上粒督,老公的妹妹穿的比我還像新娘。我一直安慰自己禽翼,他們只是感情好屠橄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闰挡,像睡著了一般锐墙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上长酗,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天溪北,我揣著相機(jī)與錄音,去河邊找鬼夺脾。 笑死之拨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咧叭。 我是一名探鬼主播蚀乔,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佳簸!你這毒婦竟也來了乙墙?” 一聲冷哼從身側(cè)響起颖变,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎听想,沒想到半個月后腥刹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汉买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年衔峰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛙粘。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡垫卤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出出牧,到底是詐尸還是另有隱情穴肘,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布舔痕,位于F島的核電站评抚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伯复。R本人自食惡果不足惜慨代,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啸如。 院中可真熱鬧侍匙,春花似錦、人聲如沸叮雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽债鸡。三九已至江滨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厌均,已是汗流浹背唬滑。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棺弊,地道東北人晶密。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像模她,于是被迫代替她去往敵國和親稻艰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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