为什么在使用哈希图获取超时错误-差异为K的数组中的哈希对时接受哈希集解决方案?

时间:2018-11-24 03:57:52

标签: java hashmap timeout hashset

我正在研究一个问题,问题是要找到对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;
    }

如果我的理解有误,请纠正我。谢谢您。

2 个答案:

答案 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)