C++数组中的K-差对


假设我们有一个数组和一个整数k,我们需要找到数组中唯一k-差对的数量。这里的k-差对是指(i, j)这样的对,其中i和j都存在于数组中,并且它们的绝对差为k。

因此,如果输入是[3,1,4,1,5],k = 2,则输出为2,因为数组中有两个2-差对:(1,3)和(3,5)。

为了解决这个问题,我们将遵循以下步骤:

  • 定义名为seen和done的映射

  • 定义一个集合s

  • 如果k < 0,则:

    • 返回0

  • 对于初始化i := 0,当i < nums的大小,更新 (i增加1),执行:

    • (seen[nums[i]]增加1)

    • 将nums[i]插入s

  • ans := 0

  • 对于集合s中的每个元素it,执行:

    • 如果k等于0,则:

      • 如果seen[it] > 1,则:

        • (ans增加1)

    • 否则

      • done[it]增加1

      • 如果(it + k)在seen中但不在done中,则:

        • (ans增加1)

      • 如果(it - k)在seen中但不在done中,则:

        • (ans增加1)

  • 返回ans

示例

让我们看看下面的实现,以便更好地理解:

在线演示

#include <bits/stdc++.h&g;
using namespace std;
class Solution {
public:
   int findPairs(vector<int>& nums, int k) {
      map<int, int> seen, done;
      set<int> s;
      if (k < 0)
         return 0;
      for (int i = 0; i < nums.size(); i++) {
         seen[nums[i]]++;
         s.insert(nums[i]);
      }
      int ans = 0;
      for (auto it = s.begin(); it != s.end(); it++) {
         if (k == 0) {
            if (seen[*it] > 1)
            ans++;
         }
         else {
            done[*it]++;
            if (seen.find(*it + k) != seen.end() && done.find(*it + k) == done.end())
               ans++;
            if (seen.find(*it - k) != seen.end() && done.find(*it - k) == done.end())
               ans++;
         }
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<int> v = {3,1,4,1,5};
   cout << (ob.findPairs(v, 2));
}

输入

{3,1,4,1,5}, 2

输出

2

更新于:2020年6月10日

304 次浏览

开始你的职业生涯

完成课程获得认证

开始学习
广告