中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何找出和為s的兩個數字

發布時間:2021-12-15 13:48:40 來源:億速云 閱讀:142 作者:小新 欄目:大數據

這篇文章主要為大家展示了“LeetCode如何找出和為s的兩個數字”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“LeetCode如何找出和為s的兩個數字”這篇文章吧。

題目描述

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

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

題目樣例

                     

示例

  • 輸入:nums = [2,7,11,15], target = 9

  • 輸出:[2,7] 或者 [7,2]

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

  • 輸出:[10,30] 或者 [30,10]

                     

題目思考

  1. 如何利用遞增排序的條件?
  2. 如何做到空間復雜度是 O(1)?
                     

解決方案

                     
思路
  • 一個比較容易想到的思路是使用一個集合, 然后遍歷一遍數組: 如果                         target-當前的數已經在集合的話, 就說明找到了一對結果, 直接返回即可; 否則就把當前的數加入集合
  • 但這個思路沒有利用到遞增排序的條件, 且使用了額外的空間, 并不是最優解
  • 如何利用排序的條件呢? 通常有兩種思路:                         二分或者雙指針
  • 這里如果使用二分的話, 意味著固定當前的數為起點, 然后二分查找右側區間                         target-當前的數是否存在, 會額外引入 logN 的時間復雜度, 還沒有上面的思路好
  • 所以嘗試使用雙指針的做法, 將兩個下標 i 和 j 初始化為數組的頭和尾, 然后往中間靠攏
  • 根據當前的和, 具體分為以下三種情況:
    1. nums[i] + nums[j] == target: 找到一對滿足條件的數字了, 直接返回
    2. nums[i] + nums[j] < target: 當前和小于 target, 因為數組有序, 如果保留 nums[i], 而 j 繼續往左的話, 新的和肯定更小于 target, 所以 nums[i]可以被安全排除, 即 i 直接加 1
    3. nums[i] + nums[j] > target: 當前和大于 target, 因為數組有序, 如果保留 nums[j], 而 i 繼續往右的話, 新的和肯定更大于 target, 所以 nums[j]可以被安全排除, 即 j 直接減 1
  • 這樣遍歷下去最終肯定 i 和 j 會相遇, 此時退出循環, 說明沒找到滿足條件的數字對, 返回空數組即可
  • 使用雙指針做法后, 時間復雜度沒有變差, 也不需要額外的空間了
                     
復雜度
  • 時間復雜度 O(N): 只遍歷了一遍數組
  • 空間復雜度 O(1): 只使用了幾個變量
                     
代碼
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 雙指針
        i, j = 0, len(nums) - 1
        while i < j:
            if nums[i] + nums[j] == target:
                # 找到一對滿足條件的數字, 直接返回
                return [nums[i], nums[j]]
            elif nums[i] + nums[j] < target:
                # 當前和小于target, 只能是i向右移, 這樣后續和才會更大
                i += 1
            else:
                # 當前和大于target, 只能是j向左移, 這樣后續和才會更小
                j -= 1
        return []

以上是“LeetCode如何找出和為s的兩個數字”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临安市| 乌海市| 黄梅县| 越西县| 五指山市| 阿瓦提县| 彝良县| 泗洪县| 冕宁县| 湾仔区| 桦甸市| 中江县| 南宫市| 南丰县| 天水市| 达州市| 阿克陶县| 方山县| 宜都市| 大英县| 洛隆县| 临夏县| 石楼县| 莫力| 和田县| 莎车县| 洛川县| 富源县| 汶川县| 丰城市| 宁都县| 闸北区| 新巴尔虎左旗| 巴楚县| 都江堰市| 信宜市| 锡林浩特市| 绥滨县| 崇左市| 阿鲁科尔沁旗| 伊春市|