我正在研究一个问题,问题是要找到对K造成影响的对数。下面是相同的代码。在下面的代码中,我使用了hashmap,但是给出了正确的答案,但其中很少在使用HashSet通过所有测试用例的情况下,我遇到了超时。有人可以帮忙为什么使用hashmap时出现超时错误,而在实际场景中,与hashset相比,hashmap计算速度更快。
static int pairs(int k, int[] arr) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<arr.length;i++)
map.put(i,arr[i]);
int count=0;
for(int j=0;j<arr.length;j++)
{
if(map.containsValue(arr[j]-k))
count++;
}
return count;
}
如果我的理解有误,请纠正我。谢谢您。
答案 0 :(得分:1)
在HashMap中查找键是O(1)*,但是在 value 中查找是O(n)-它必须循环遍历每个条目,一次一次,直到它找到一个匹配的值。
如果您想要类似HashSet的行为,则需要将查找的内容放入键中,而不是值中。然后,您将使用containsKey
,而实际上并不关心值是什么。其实是implementation of HashSet that OpenJDK uses。
*实际上比这要复杂一点,但是您通常可以将其视为O(1)
答案 1 :(得分:0)
可能您可以通过这种方式编写代码并检查:-
import java.util.*;
class GFG {
/* Returns count of pairs with
difference k in arr[] of size n. */
static int countPairsWithDiffK(int arr[], int n,
int k)
{
int count = 0;
Arrays.sort(arr); // Sort array elements
int l = 0;
int r = 0;
while(r < n)
{
if(arr[r] - arr[l] == k)
{
count++;
l++;
r++;
}
else if(arr[r] - arr[l] > k)
l++;
else // arr[r] - arr[l] < sum
r++;
}
return count;
}
public static void main(String[] args)
{
int arr[] = {1, 5, 3, 4, 2};
int n = arr.length;
int k = 3;
System.out.println("Count of pairs with given diff is " +
countPairsWithDiffK(arr, n, k));
}
}
时间复杂度:O(nlogn)