给定一个数组 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
Javascript
输出:
5
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。