对 (arr[i], arr[j]) 的计数,使得 arr[i] + j 和 arr[j] + i 相等
给定一个数组arr[] ,任务是计算对i, j使得i < j和arr[i] + j = arr[j] + i 。
例子:
Input: arr[] = {4, 1, 2, 3}
Output: 3
Explanation: In total three pairs are satisfying the given condition those are {1, 2}, {2, 3} and {1, 3}.
So, the final answer is 3.
Input: arr[] = {1, 5, 6}
Output: 1
朴素方法:解决这个问题的朴素方法是检查给定条件下的每一对数组并计算这些对。
时间复杂度: O(N),其中 N 是 arr[] 的大小。
辅助空间: O(1)。
高效的方法:这个问题可以通过使用hashmaps来解决。首先,我们可以扭曲给定给我们的条件,我们可以将arr[j] + i= arr[i]+ j it 更改为arr[j] – j = arr[i] – i,这意味着两个不同的数字它们的价值和指数具有相同的差异。这很容易,现在按照以下步骤解决给定的问题。
- 创建一个地图mp和一个变量ans = 0来存储答案。
- 用说 i 遍历整个数组arr[] 。
- 对于每个元素,我们将找出其值和索引的差异,只需a[i] – i 。
- 如果地图中存在某些值,则意味着存在具有相同值的其他数字,因此我们会将这些频率添加到答案中。
- 增加mp[a[i] – i]的值。
- 返回ans作为最终答案。
下面是上述方法的实现:
C++
#include
using namespace std;
// Function to count pairs with given properties
int solve(int N, int arr[])
{
// Map for the storing the frequency
// of a given difference
map mp;
// Variable to store the final ans
int ans = 0;
// Traverse the array and update mp
for (int i = 0; i < N; i++) {
ans += mp[arr[i] - i];
mp[arr[i] - i]++;
}
// Return the final result
return ans;
}
int main()
{
int N = 4;
int arr[] = { 4, 1, 2, 3 };
// Print the result
cout << solve(N, arr);
return 0;
}
Java
import java.util.*;
class GFG{
// Function to count pairs with given properties
static int solve(int N, int arr[])
{
// Map for the storing the frequency
// of a given difference
HashMap mp = new HashMap();
// Variable to store the final ans
int ans = 0;
// Traverse the array and update mp
for (int i = 0; i < N; i++) {
if(mp.containsKey(arr[i]-i)){
ans+=mp.get(arr[i]-i);
mp.put(arr[i]-i, mp.get(arr[i]-i)+1);
}
else{
mp.put(arr[i]-i, 1);
}
}
// Return the final result
return ans;
}
public static void main(String[] args)
{
int N = 4;
int arr[] = { 4, 1, 2, 3 };
// Print the result
System.out.print(solve(N, arr));
}
}
// This code is contributed by shikhasingrajput
Python3
# Python Program to implement
# the above approach
# Function to count pairs with given properties
def solve(N, arr):
# Map for the storing the frequency
# of a given difference
mp = dict()
# Variable to store the final ans
ans = 0
# Traverse the array and update mp
for i in range(N):
if ((arr[i] - i) not in mp):
mp[arr[i] - i] = 0
ans += mp[arr[i] - i]
mp[arr[i] - i] = mp[arr[i] - i] + 1
# Return the final result
return ans
N = 4
arr = [4, 1, 2, 3]
# Print the result
print(solve(N, arr))
# This code is contributed by Saurabh Jaiswal
C#
using System;
using System.Collections.Generic;
public class GFG{
// Function to count pairs with given properties
static int solve(int N, int []arr)
{
// Map for the storing the frequency
// of a given difference
Dictionary mp = new Dictionary();
// Variable to store the readonly ans
int ans = 0;
// Traverse the array and update mp
for (int i = 0; i < N; i++) {
if(mp.ContainsKey(arr[i]-i)){
ans+=mp[arr[i]-i];
mp[arr[i]-i]= mp[arr[i]-i]+1;
}
else{
mp.Add(arr[i]-i, 1);
}
}
// Return the readonly result
return ans;
}
public static void Main(String[] args)
{
int N = 4;
int []arr = { 4, 1, 2, 3 };
// Print the result
Console.Write(solve(N, arr));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出
3
时间复杂度: ,其中 N 是数组的大小。
辅助空间: O(N),其中 N 是数组的大小。