1. 程式人生 > 其它 >LeetCode-簡單-兩數之和

LeetCode-簡單-兩數之和

技術標籤:leetcodec++leetcode

LeetCode-簡單-兩數之和


前言

新手入門,LeetCode筆記,請多指教~


一、題目:兩數之和

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

你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。

示例:

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

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

二、程式碼

程式碼如下:

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

三、收穫

  1. 關於C++ vector 容器

    vector

  2. not all control paths return a value 報錯

    報錯的原因是並不是所有情況都有返回值,這裡由於返回值型別的限制(vector),所以只能返回空vector容器。

四、結果&借鑑學習

執行結果

以下是官方給出的解題方法一:暴力列舉

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

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

這裡比我厲害的地方在於:

  1. 內層迴圈的int j=i+1
    到每一個位於 x 之前的元素都已經和 x 匹配過,因此不需要再進行匹配。而每一個元素不能被使用兩次,所以我們只需要在 x 後面的元素中尋找 target - x。

  2. return {i,j}; 這裡的表達也比我的更加簡潔。

複雜度分析

時間複雜度:O(N^2),其中 NN 是陣列中的元素數量。最壞情況下陣列中任意兩個數都要被匹配一次。

空間複雜度:O(1)O(1)。

方法二:雜湊表

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

複雜度分析

時間複雜度:O(N),其中 NN 是陣列中的元素數量。對於每一個元素 x,我們可以 O(1)O(1) 地尋找 target - x。

空間複雜度:O(N),其中 NN 是陣列中的元素數量。主要為雜湊表的開銷。