【LeetCode刷題(簡單程度)】劍指 Offer 57. 和為s的兩個數字

讀研的小狗子 發表於 2020-10-17

輸入一個遞增排序的陣列和一個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[2,7] 或者 [7,2]
示例 2:

輸入:nums = [10,26,30,31,47,60], target = 40
輸出:[10,30] 或者 [30,10]

限制:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6

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

思路1: 利用雜湊表,這思路和LeetCode第一題類似,但這樣顯然是沒用到排序好了的這個性質,所以為下策。

class Solution {
public:
    unordered_map<int,int> table;
    vector<int> res;
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        if(n == 0)
            return res;
        for(int i = 0;i < n; ++i)
        {
            table[nums[i]] = i;//儲存下標
        }

        int index = 0;
        for(int i = 0;i < n;++i)
        {
            int rest = target - nums[i];
            if(table.find(rest) == table.end())//說明沒找到與nums[i]相加為target的數
                continue;
            else
            {
                index = table[rest];
                if(index == i) //排除和自己相加的和為target
                    continue;
                else
                {
                    res.push_back(nums[i]);
                    res.push_back(nums[index]);
                    break;
                }
            }
        }
        return res;
        }
};

思路二:因為陣列是已經排序好的,我們可以使用兩個指標,分別從前和後向中間遍歷,如果這兩個指標所指向的數字的和小於target,那麼說明我們選取的數字有點偏小,那麼我們將左邊的指標往右移動,反之說明我們選擇的數字過於大了,那麼就將右邊的指標往左邊移動。

class Solution {
public:
    
    vector<int> res;
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        if(n == 0)
            return res;
        int left = 0;
        int right = n - 1;
        while(left < right)
        {
            if(nums[left] + nums[right] > target)
            {
                right--;
            }
            else if(nums[left] + nums[right] < target)
            {
                left++;
            }
            else
            {
                res.push_back(nums[left]);
                res.push_back(nums[right]);
                break;
            }
        }
        return res;
    }
};