LeetCode之兩數之和(一)

目錄

引言

題目

解題

方法一、純暴力

方法二、哈希表法


引言

工作久了之後,突然發現大學時候的算法題離自己越來越遠了,刷再多的題,也只是在面試的時候用到。也不知怎麼的,最近特別想刷題。爲了堅持下去,每日在CSDN博客打卡。

題目

(原題鏈接: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]。

解題

方法一、純暴力

因爲題目中要求同一元素不能使用兩次,所以可以採用每個元素和後面每個元素相加求和再與目標值比較的方法。

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

執行結果:

方法二、哈希表法

因爲題目結果只對應一個答案,所以可以認爲數組中沒有相同元素,簡化模型。這樣我們可以構建一個哈希表,鍵是數組元素的值,值是數組元素的下標。這裏可能跟我們腦海中的模型是反着的,不能理解也沒有關係,直接看代碼就懂了:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        unordered_map<int,int> map; // 這裏本想用hash_map的,但是它還沒有成爲C++11的正式標準
        for (int i = 0; i < nums.size(); i ++) {
            if (map.find(target-nums[i]) != map.end()) {
                res.push_back(map[target-nums[i]]);
                res.push_back(i);
            }
            map[nums[i]] = i; // 放在if的後邊,是爲了避免i=0時的誤判
        }
        return res;
    }
};

執行結果:

 

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