刷题leetcode--532. K-diff Pairs in an Array

12 篇文章 0 订阅
11 篇文章 0 订阅

532. K-diff Pairs in an Array 大笑2018.1.11

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.

Example 1:

Input: [3, 1, 4, 1, 5], k = 2
Output: 2
Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5).
Although we have two 1s in the input, we should only return the number of unique pairs.

Example 2:

Input:[1, 2, 3, 4, 5], k = 1
Output: 4
Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).

Example 3:

Input: [1, 3, 1, 5, 4], k = 0
Output: 1
Explanation: There is one 0-diff pair in the array, (1, 1).

Note:

  1. The pairs (i, j) and (j, i) count as the same pair.
  2. The length of the array won't exceed 10,000.
  3. All the integers in the given input belong to the range: [-1e7, 1e7].
题意:给定参数:一个数组nums,一个值k,找出数组的项的差值为k的总个数。重复数的差值只算一次。
知识点:先排序,再数组遍历,可以采用滑动窗口的方法进行移动再比较。

解法一是常规方法
双层循环,从头到后遍历,因为已经排序,所以到差值为k的时候就停止此轮循环,break进入下一个。
class Solution {
    public int findPairs(int[] nums, int k) {
        //方法一:先排序再相邻比较
         Arrays.sort(nums); //排序
         int res=0;  //记录结果
         for(int i=0;i<nums.length-1;i++){
             for(int j=i+1;j<nums.length;j++)
                 if(nums[j]-nums[i]==k){  
                     res++; 
                     break;  //结束本轮循环
               }      
                while(i<nums.length-1 && nums[i]==nums[i+1]) //相同的数字跳过
                    i++;
            
         }
          return res;
                      
    }
}



解法二:用滑动窗口的方式,组排序之后差是可以连续移动两个指针(left,right)得到的,这种方法同样要对相同的数字进行排除
class Solution {
    public int findPairs(int[] nums, int k) {        
        //方法二,采用滑动窗口方法
        if(k<0 || nums.length<=1) return 0;
        
        Arrays.sort(nums);
        int left=0;
        int right=1;
        int count=0;
        
        while(right<nums.length){
            int first= nums[left];
            int sec = nums[right];
            if(sec-first<k) 
                right++;
            else if(sec-first>k)
                left++;
            else{
                count++;
                //跳过重复数字
                while(left<nums.length && nums[left]==first){
                     left++;
                }
                 while(right<nums.length && nums[right]==sec){
                     right++;
                 }   
            }
            if(right == left ){
                right++;
            }
            
        }
        return count;
        
        
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值