题目详情

Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k.

这道题的意思是,输入一个整数数组和一个整数k,我们需要找出数组中绝对值差正好为k的不重复的整数对儿

Example 1:
Input: [3, 1, 4, 1, 5], k = 2
Output: 2
这个例子中有两个不同的整数对, (1, 3)和(3, 5).

Example 2:
Input:[1, 2, 3, 4, 5], k = 1
Output: 4
这个例子里有四个不同的整数对(1, 2), (2, 3), (3, 4)和(4, 5).

Example 3:
Input: [1, 3, 1, 5, 4], k = 0
Output: 1
这个例子里有一个符合要求的整数对(1,1)

想法

  • 这道题我分两种情况进行的讨论,一种是k不为0的时候,我通过新建一个hashset来完成计算。
  • 由于hashset无法处理相同key的操作,所依对于k==0的时候,我采用了hashmap进行操作。
  • k为0时,对于每一次遍历,找到这个值是否已经存在在hashmap里,同时获取这个值出现过的次数(value)。如果次数为1,那么我们获得了一个符合要求的整数对,如果次数大于1,那么说明这个整数对已经被统计过了,可以忽略。如果这个键值未曾出现在hashmap里,那么我们将其存入hashmap,将value赋值为1.
  • 当k不为0时,我们遍历每一个元素,如果这个元素和当前set中的元素不重复的话,我们将这个元素存入set,然后判断在set中是否有满足和这个元素的绝对值相差为k的整数出现,如果有,构成一个整数对。

解法

        int res = 0;
        if(k < 0)return 0;
        if(k == 0){
            HashMap<Integer,Integer> countZero = new HashMap<Integer,Integer>();
            for(int i=0;i<nums.length;i++){
                if(countZero.containsKey(nums[i])){
                    if(countZero.get(nums[i]) == 1){
                        res ++;
                        countZero.put(nums[i], 2);
                    }
                }else{
                    countZero.put(nums[i], 1);    
                }
            }
        }else{        
            Set<Integer> count = new HashSet<Integer>();
            for(int num : nums){
                if(!count.add(num)){continue;}
                if(count.contains(num+k)){
                    res ++;
                } 
                if(count.contains(num-k)){
                    res ++;
                }
            }
            
        }
        return res;

soleil阿璐
350 声望45 粉丝

stay real ~