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

溫馨提示×

溫馨提示×

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

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

LeetCode如何解決數組中K-diff數對的問題

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

小編給大家分享一下LeetCode如何解決數組中K-diff數對的問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、題目描述

給定一個整數數組和一個整數 k, 你需要在數組里找到不同的 k-diff 數對。這里將 k-diff 數對定義為一個整數對 (i, j), 其中 i 和 j 都是數組中的數字,且兩數之差的絕對值是 k。

示例 1:

  • 輸入: [3, 1, 4, 1, 5], k = 2
  • 輸出: 2

解釋: 數組中有兩個 2-diff 數對, (1, 3) 和 (3, 5)。盡管數組中有兩個 1,但我們只應返回不同的數對的數量。

 

二、解題思路

利用兩個數的絕對值之差為 k 的關系 x - y = k,推出 y = x - k 和 x = y + k:

  • saw 集合保存訪問過的元素
  • diff 集合保存已找到的 k-diff 數對中的較小值
  • 遍歷所有元素,判斷當前元素是否符合下面 2 個條件之一
  • 如果 y = x - k (1 = 3 - 2) 在 saw 中,則在 diff 中加入較小值 x - k = 1
  • 如果 x = y + k (3 = 1 + 2)在 saw 中,則在 diff 中加入較小值 y = 1
  • 在 saw 中加入已訪問的元素
  • 放回 diff 集合的大小(set 相同的元素只存放一次)

要注意 set 中相同的元素只存放一次,所以對于 3 1 4 1 5 的情況,diff 集合中只會保存 1 個元素 1,表示只有一個 (1, 3) 數對。

class Solution {
public:
  int findPairs(vector<int>& nums, int k) {
    if (k < 0)
      return 0;

    // 保存訪問的元素
    std::set<int> saw;

    // 保存 k-diff 數對中較小的那個
    // 也可以保存較大的,只用來統計數對個數
    std::set<int> diff;

    for (int i = 0; i < nums.size(); i++) {
      // 檢查數對中較小的數 1 是否在數組中:3 - 2 = 1
      if (saw.find(nums[i] - k) != saw.end())
        diff.insert(nums[i] - k); // 插入數對中較小的數 1

      // 檢查數對中較大的數 3 是否在數組中:1 + 2 = 3
      if (saw.find(nums[i] + k) != saw.end())
        diff.insert(nums[i]); // 插入數對中較小的數 1

      saw.insert(nums[i]);
    }

    // 因為 set 中不存在重復元素
    // 所以不同的元素個數代表不同的 k-diff 數對個數
    return diff.size();
  }
};
    
復雜度分析
  • 時間復雜度:O(n),只需要遍歷一次數組
  • 空間復雜度:O(n),set 集合空間與數組大小 n 呈線性增長


看完了這篇文章,相信你對“LeetCode如何解決數組中K-diff數對的問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

新闻| 都昌县| 长乐市| 陵川县| 东城区| 文水县| 阿瓦提县| 巴南区| 全南县| 湟源县| 芜湖县| 济阳县| 台江县| 西藏| 葫芦岛市| 定日县| 崇信县| 阿克陶县| 台北市| 阿克| 咸阳市| 香格里拉县| 绍兴县| 二连浩特市| 许昌市| 文水县| 满城县| 若尔盖县| 双峰县| 新泰市| 曲阳县| 陇西县| 武宣县| 吴桥县| 镇沅| 临颍县| 阳高县| 红安县| 尚志市| 宜宾县| 潞城市|