[圖解leetcode高頻面試之數組系列]1兩數之和

前言

秋招的結束,面試了大大小小的公司,最大的問題在於算法上。所以打算堅持在leetcode打卡,看看到底能不能行,如果你想見證,那我來開車,你坐穩,一起走向更好的遠方。2020=1024+996,準備好了?

一 題目

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

1 leetcode鏈接

https://leetcode-cn.com/problems/two-sum/

示例

給定 nums = [2, 7, 11, 15], target = 9

因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

2 思路1—暴力解法

我們需要在一個數組nums中尋找兩個數,然後呢這個兩個數之和需要等於目標的值。ok,我的外層循環從第一個數開始遍歷,內層循環從第二個數遍歷,如果這兩個數和等於目標值,我就返回下標,問題來了,我要返回下標,所以需要先暫存起來才方便,而且返回的類型也需要確定。在這裏,我的返回類型爲vector,然後可以直接使用{i,j}的方式來存儲下標。好了,代碼呈上!

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

3 思路2—上hash

首先咋們想想hash是個什麼玩意兒,存在既有意義嘛。從定義來說是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。那我們看看下圖,看NBA的童鞋應該知道下面的幾位大佬,他們也有對應的外號,這樣就形成了key value的hash結構。
在這裏插入圖片描述
ok,那有些小夥伴有想法了,貌似很多明星都有好幾個外號呀,比如哈登還有大鬍子的外號怎麼辦,這裏咱們可以使用拉鍊法的方式如下圖。

在這裏插入圖片描述
好了,我們大概知道hash的一點點基本原理,然後這個題目怎麼使用hash來解決呢?

  • 確定返回值類型爲vector
  • 在c++中類似hash這種key,value的容器有map,unorder_map等,我們選擇unordered_map。
  • 循環遍歷數組,每得到一個元素A,就去hash表中尋找是否存在target-A,注意,hash查找的時間複雜度爲O(1)
class Solution {
public:  
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        unordered_map<int, int> hash_map;//由於unorder_map速度要比map快所以選擇無序哈希表  
        for(int i=0; i < nums.size();++i){
            int another = target - nums[i];
            if(hash_map.count(another)){  
                res = vector<int>({hash_map[another], i});
                return res;
            }
            hash_map[nums[i]] = i;
        }
        return res;
    }
};

4 總結

文中使用了兩種方式來解決這個問題,第一種爲複雜度較高的暴力解答,第二種使用hash的方式來解答,其中瞭解hash的基本原理,後續會對hash進行詳細的闡述以及應用場景。至此,咱們想想如何解決三數之和的問題呢?

5 結尾

希望讀者和咱一起一步一個腳印去把基礎知識打牢固。如果讀者發現有什麼錯誤或者不太好的地方,歡迎私我,我會及時修改。
在這裏插入圖片描述

發佈了34 篇原創文章 · 獲贊 65 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章