亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

称多县| 西安市| 萍乡市| 阿勒泰市| 布尔津县| 大姚县| 西峡县| 福鼎市| 文水县| 云梦县| 淮北市| 北辰区| 双峰县| 二连浩特市| 江安县| 疏附县| 育儿| 临朐县| 灵寿县| 福泉市| 芜湖县| 藁城市| 本溪市| 射阳县| 天峻县| 沙田区| 大埔县| 利川市| 安徽省| 长宁区| 阿拉善右旗| 全椒县| 永修县| 綦江县| 滨州市| 宁武县| 师宗县| 大连市| 宣威市| 松江区| 日土县|