列表

详情


NC409. k-dis数对

描述

给定一个长度为 n 的整数数组 nums ,和一个正整数 k,你需要输出不同的 k-dis 数对数量。
k-dis 数对定义为一个整数对 ,满足 ,且

数据范围:

示例1

输入:

[3,1,4,6,5],3

输出:

2

说明:

(4,1),(6,3)

示例2

输入:

[3,1,4,6,4],3

输出:

2

说明:

(4,1) (6,3) 虽然有两个 (4,1) 数对,但只统计不同的数对

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 35ms, 内存消耗: 3776KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int k_dis(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(),nums.end());
        int i=0,j=0,z=0;
        while(j<nums.size())
        {
            if(nums[j]-nums[i]<k)
            {
                j++;
            }else if(nums[j]-nums[i]==k&&nums[j]!=nums[j-1])
            {
                z++;
                j++;
            }else if(nums[j]-nums[i]>k)
            {
                i++;
            }else{
                j++;
            }
        }
        return z;
        
    }
};

C++ 解法, 执行用时: 35ms, 内存消耗: 3804KB, 提交时间: 2022-08-04

class Solution {
  public:
    int k_dis(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int i = 0, j = 0, z = 0;
        
        while (j < nums.size()) {
            if (nums[j] - nums[i] < k) {
                j++;
            } else if (nums[j] - nums[i] == k && nums[j] != nums[j - 1]) {
                z++;
                j++;
            } else if (nums[j] - nums[i] > k) {
                i++;
            } else {
                j++;
            }
        }
        return z;
    }
};

C++ 解法, 执行用时: 39ms, 内存消耗: 3760KB, 提交时间: 2022-07-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int k_dis(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(), nums.end());
        int i = 0, j = 0, res = 0;
        while(j < nums.size()){
            if(nums[j] - nums[i] < k){
                j ++;
            }
            else if(nums[j] - nums[i] == k && nums[j] != nums[j - 1]){
                res ++;
                j ++;
            }else if(nums[j] - nums[i] > k){
                i ++;
            }else{
                j ++;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 45ms, 内存消耗: 3784KB, 提交时间: 2022-07-19

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int k_dis(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(), nums.end());
        nums.erase(unique(nums.begin(), nums.end()), nums.end());
        int cnt = 0;
        for (auto iter = nums.begin(); iter != nums.end(); iter++) {
            if (binary_search(nums.begin(), nums.end(), *iter + k)) {
                cnt++;
            }
        }
        return cnt;
//         unordered_set<int> st;
//         for (auto num : nums) {
//             st.insert(num);
//         }
        
//         int cnt = 0;
//         for (auto iter = st.begin(); iter != st.end(); iter++) {
//             if (st.find(*iter + k) != st.end()) {
//                 cnt++;
//             }
//         }
//         return cnt;
    }
};

C++ 解法, 执行用时: 52ms, 内存消耗: 6324KB, 提交时间: 2022-07-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int k_dis(vector<int>& nums, int k) {
        // write code here
        unordered_set<int> st;
        for(int num:nums){
            st.insert(num);
        }
        int res=0;
        for(auto it=st.begin();it!=st.end();++it){
            if(st.find(*it+k)!=st.end()){
                ++res;
            }
        }
        return res;
    }
};

上一题