算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 数组中的K-diff数对,我们先来看题面:
https://leetcode-cn.com/problems/k-diff-pairs-in-an-array/
Given an array of integers nums and an integer k, return the number of unique k-diff pairs in the array. A k-diff pair is an integer pair (nums[i], nums[j]), where the following are true: 0 <= i, j < nums.length i != j nums[i] - nums[j] == k Notice that |val| denotes the absolute value of val.
给定一个整数数组和一个整数 k,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
这里将 k-diff 数对定义为一个整数对 (nums[i], nums[j]),并满足下述全部条件:
注意,|val| 表示 val 的绝对值。
示例 1:
输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。
示例 2:
输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。
示例 3:
输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1)。
解题思路:
1.如果k<0,返回0
2.k!=0,双层遍历数组,如果nums[i]-nums[j]==k||nums[i]-nums[j]==-k,表示找到一对,将nums[i]和nums[j]中较小者存入set中
3.返回set的大小
代码实现:
class Solution {
public int findPairs(int[] nums, int k) {
int len=nums.length;
if(k<0){
return 0;
}
Set<Integer> set=new HashSet<>();
for(int i=0;i<len-1;++i){
for(int j=i+1;j<len;++j){
if(nums[i]-nums[j]==k||nums[i]-nums[j]==-k){
int val=nums[i]>nums[j]?nums[j]:nums[i];
if(!set.contains(val)){
set.add(val);
}
}
}
}
return set.size();
}
}
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。
上期推文: