📌  相关文章
📜  找到元素X的数量,使得X + K也存在于数组中

📅  最后修改于: 2021-05-19 18:36:13             🧑  作者: Mango

给定一个数组a []和一个整数k ,找到此数组中元素x的数量,以使x和k的总和也存在于数组中。

例子:

Input:  { 3, 6, 2, 8, 7, 6, 5, 9 } and k = 2
Output: 5 
Explanation:
Elements {3, 6, 7, 6, 5} in this array have x + 2 value that is
{5, 8, 9, 8, 7} present in this array.

Input:  { 1, 2, 3, 4, 5} and k = 1
Output: 4
Explanation:
Elements {1, 2, 3, 4} in this array have x + 2 value that is
{2, 3, 4, 5} present in this array.

问题类似于在数组中找到具有给定总和的对数。

天真的方法:

解决上面提到的问题,我们可以使用蛮力方法并找到结果。迭代两个循环,检查数组中每个x是否存在x + 2。如果存在,则增加计数,最后返回计数。

高效方法:

解决此问题的有效方法是使用HashMap,map中的键将充当此数组中的唯一元素,并且相应的值将告诉我们该元素的出现频率。

在此映射上进行迭代,并针对该映射中的每个键x查找映射中是否存在键x + k,如果存在,则将该频率添加到答案中,即对于此元素x,我们在该数组中具有x + k。最后,返回答案。

下面是上述方法的实现:

C++
// C++ implementation of find number
// of elements x in this array
// such x+k also present in this array.
#include 
using namespace std;
  
// Function to return the
// count of element x such that
// x+k also lies in this array
int count_element(int N, int K, int* arr)
{
    // Key in map will store elements
    // and value will store the
    // frequency of the elements
    map mp;
  
    for (int i = 0; i < N; ++i)
        mp[arr[i]]++;
  
    int answer = 0;
  
    for (auto i : mp) {
  
        // Find if i.first + K is
        // present in this map or not
        if (mp.find(i.first + K) != mp.end())
  
            // If we find i.first or key + K in this map
            // then we have to increase in answer
            // the frequency of this element
            answer += i.second;
    }
  
    return answer;
}
  
// Driver code
int main()
{
    // array initialisation
    int arr[] = { 3, 6, 2, 8, 7, 6, 5, 9 };
  
    // size of array
    int N = sizeof(arr) / sizeof(arr[0]);
  
    // initialise k
    int K = 2;
  
    cout << count_element(N, K, arr);
  
    return 0;
}


Java
// Java implementation of find number
// of elements x in this array
// such x+k also present in this array.
import java.util.*;
  
class GFG{
   
// Function to return the
// count of element x such that
// x+k also lies in this array
static int count_element(int N, int K, int[] arr)
{
    // Key in map will store elements
    // and value will store the
    // frequency of the elements
    HashMap mp = new HashMap();
   
    for (int i = 0; i < N; ++i)
        if(mp.containsKey(arr[i])){
            mp.put(arr[i], mp.get(arr[i])+1);
        }else{
            mp.put(arr[i], 1);
    }
   
    int answer = 0;
   
    for (Map.Entry i : mp.entrySet()) {
   
        // Find if i.first + K is
        // present in this map or not
        if (mp.containsKey(i.getKey() + K) )
   
            // If we find i.first or key + K in this map
            // then we have to increase in answer
            // the frequency of this element
            answer += i.getValue();
    }
   
    return answer;
}
   
// Driver code
public static void main(String[] args)
{
    // array initialisation
    int arr[] = { 3, 6, 2, 8, 7, 6, 5, 9 };
   
    // size of array
    int N = arr.length;
   
    // initialise k
    int K = 2;
   
    System.out.print(count_element(N, K, arr));
}
}
  
// This code is contributed by Princi Singh


Python3
# Python3 implementation of find number
# of elements x in this array
# such x+k also present in this array.
  
# Function to return the
# count of element x such that
# x+k also lies in this array
def count_element(N, K, arr):
      
    # Key in map will store elements
    # and value will store the
    # frequency of the elements
    mp = dict()
  
    for i in range(N):
        mp[arr[i]] = mp.get(arr[i], 0) + 1
  
    answer = 0
  
    for i in mp:
  
        # Find if i.first + K is
        # present in this map or not
        if i + K in mp:
  
            # If we find i.first or key + K in this map
            # then we have to increase in answer
            # the frequency of this element
            answer += mp[i]
  
    return answer
  
# Driver code
if __name__ == '__main__':
    # array initialisation
    arr=[3, 6, 2, 8, 7, 6, 5, 9]
  
    # size of array
    N = len(arr)
  
    # initialise k
    K = 2
  
    print(count_element(N, K, arr))
      
# This code is contributed by mohit kumar 29


C#
// C# implementation of find number
// of elements x in this array
// such x+k also present in this array.
using System;
using System.Collections.Generic;
  
public class GFG{
    
// Function to return the
// count of element x such that
// x+k also lies in this array
static int count_element(int N, int K, int[] arr)
{
    // Key in map will store elements
    // and value will store the
    // frequency of the elements
    Dictionary mp = new Dictionary();
    
    for (int i = 0; i < N; ++i)
        if(mp.ContainsKey(arr[i])){
            mp[arr[i]] = mp[arr[i]]+1;
        }else{
            mp.Add(arr[i], 1);
    }
    
    int answer = 0;
    
    foreach (KeyValuePair i in mp) {
    
        // Find if i.first + K is
        // present in this map or not
        if (mp.ContainsKey(i.Key + K) )
    
            // If we find i.first or key + K in this map
            // then we have to increase in answer
            // the frequency of this element
            answer += i.Value;
    }
    
    return answer;
}
    
// Driver code
public static void Main(String[] args)
{
    // array initialisation
    int []arr = { 3, 6, 2, 8, 7, 6, 5, 9 };
    
    // size of array
    int N = arr.Length;
    
    // initialise k
    int K = 2;
    
    Console.Write(count_element(N, K, arr));
}
}
// This code contributed by Princi Singh


输出:
5