📌  相关文章
📜  对 (arr[i], arr[j]) 的计数,使得 arr[i] + j 和 arr[j] + i 相等

📅  最后修改于: 2022-05-13 01:57:47.620000             🧑  作者: Mango

对 (arr[i], arr[j]) 的计数,使得 arr[i] + j 和 arr[j] + i 相等

给定一个数组arr[] ,任务是计算对i, j使得i < jarr[i] + j = arr[j] + i

例子:

朴素方法:解决这个问题的朴素方法是检查给定条件下的每一对数组并计算这些对。

时间复杂度: 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

时间复杂度: O(N)          ,其中 N 是数组的大小。

辅助空间: O(N),其中 N 是数组的大小。