1. 程式人生 > 其它 >每日一練(29):和為s的兩個數字

每日一練(29):和為s的兩個數字


title: 每日一練(29):和為s的兩個數字

categories:[劍指offer]

tags:[每日一練]

date: 2022/03/02


每日一練(29):和為s的兩個數字

輸入一個遞增排序的陣列和一個數字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

方法一:雜湊

思路:

  • 建立雜湊表

  • 遍歷陣列

  • 若雜湊表中存在元素與當前遍歷到的元素之和為 target 則返回結果即可

  • 沒有滿足條件的元素,返回空

vector<int> twoSum(vector<int>& nums, int target) {
    // 建立雜湊表
    unordered_set<int> s;
    // 遍歷陣列
    for (int x : nums) {
        // 若雜湊表中存在元素與當前遍歷到的元素之和為target
        // 則返回結果即可
        if (s.count(target - x)) {
            return vector<int>{x, target - x};
        }
        // 插入當前遍歷到的元素
        s.insert(x);
    }
    // 沒有滿足條件的元素,返回空
    return {};
}

方法二:雙指標

充分利用遞增陣列的性質,雙指標從頭尾開始遍歷,兩數和小於目標,則left++;大於目標,則right--。

vector<int> twoSum(vector<int>& nums, int target) {
    int l = 0; int r = nums.size() - 1;
    while (l < r) {
        if (target == nums[l] + nums[r]) {
            return vector<int>{nums[l], nums[r]};
        }
        else if (target > nums[l] + nums[r]) {    
            l++;
        }
        else if (target < nums[l] + nums[r]) {    
            r--;
        }
    }
    return vector<int>();
}