您的位置:首页 > 大数据 > 人工智能

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

2018-01-11 17:05 656 查看
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
Exp
ca43
lanation: 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:

The pairs (i, j) and (j, i) count as the same pair.
The length of the array won't exceed 10,000.
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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: