LeetCode題解——1. 兩數之和

題目相關

題目鏈接

LeetCode中國,https://leetcode-cn.com/problems/two-sum/

題目描述

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

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

示例

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

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

題目分析

LeetCode 給出本題難度簡單。

題意分析

在給定的數組中,找出一組數據,和正好爲 target。題目會保證只有一對答案。

樣例數據分析

基礎思路就是遍歷一下數組,建立一個哈希表。我們的樣例輸入簡單修改一下(如果不改,數據馬上就出來了),改爲 [2, 11, 15, 7],首先,我們建立一個哈希表 unordered_map<int, int> ans,第一個 int 存的是數組 nums 中的數據,第二個 int 存的是這個數據在數組 nums 的索引。

1、第一個數據爲 2,目標爲 9。因此 9-2=7,我們在 ans 中去查找有沒有數據 7 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[2]=0。這個是什麼意思呢?就是數據 2 的位置是在數組的第 0 個位置。

2、第二個數據爲 11,目標爲 9。因此 9-11=-2,我們在 ans 中去查找有沒有數據 -2 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[11]=1。這個是什麼意思呢?就是數據 11 的位置是在數組的第 1 個位置。

3、第三個數據爲 15,目標爲 9。因此 9-15=-6,我們在 ans 中去查找有沒有數據 -6 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[15]=3。這個是什麼意思呢?就是數據 15 的位置是在數組的第 2 個位置。

4、第三個數據爲 7,目標爲 9。因此 9-7=2,我們在 ans 中去查找有沒有數據 2 的索引。這樣我們可以在 ans 中找到數據 2,所以輸出對應的數據就可以了。

算法設計

從上面的樣例數據分析過程,我們可以看出了,核心問題就是要建立起索引表。方法很簡單,就是遍歷 nums 數組即可。

AC 參考代碼

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> ans;//答案
        //遍歷建立哈希表
        for (int i=0; i<nums.size(); i++) {
            if (ans.find(target-nums[i]) != ans.end()) {
                //只會對應一個答案
                return {ans[target-nums[i]], i};
            }

            ans[nums[i]] = i;
        }

        //沒有結果
        return {};
    }
};

暴力法

本題也可以使用暴力搜索。思路就不詳細寫了,就是兩個循環比對即可。

參考代碼

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int len=nums.size();

        for(int i=0;i<len-1;i++) {
            for(int j=i+1;j<len;j++) {
                if (nums[i]+nums[j] == target) {
                    return {i,j};
                }
            }
        }
        
        return {};
    }
};

經過測試,這個暴力竟然能通過。可能是 LeetCode 對本題定義爲簡單導致的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章