Open In App

Count of subarrays of size K having at least one pair with absolute difference divisible by K-1

Given an arr[] consisting of N elements, the task is to count all subarrays of size K having atleast one pair whose absolute difference is divisible by K – 1.
Examples: 
 

Input: arr[] = {1, 5, 3, 2, 17, 18}, K = 4 
Output:
Explanation: 
The three subarrays of size 4 are: 
{1, 5, 3, 2}: Pair {5, 2} have difference divisible by 3 
{5, 3, 2, 17}: Pairs {5, 2}, {5, 17}, {2, 17} have difference divisible by 3 
{3, 2, 17, 18}: Pairs {3, 18}, {2, 17} have difference divisible by 3 
Input: arr[] = {1, 2, 3, 4, 5}, K = 5 
Output:
Explanation: 
{1, 2, 3, 4, 5}: Pair {1, 5} is divisible by 4 
 



 

Naive Approach: 
The simplest approach to solve the problem is to iterate over all subarrays of size K and check if there exists any pair whose difference is divisible by K – 1
Time Complexity: O(N * K * K)
Efficient Approach: The above approach can be optimized using Pigeonhole Principle. Follow the steps below to solve the problem: 
 



Below is the implementation of the above approach:
 




// C++ implementation of the
// above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the required
// number of subarrays
int findSubarrays(int arr[],
                  int N,
                  int K)
{
    // Return number of possible
    // subarrays of length K
    return N - K + 1;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 5, 3, 2, 17, 18 };
    int K = 4;
    int N = sizeof(arr) / sizeof(arr[0]);
 
    cout << findSubarrays(arr, N, K);
 
    return 0;
}




// Java implementation of the
// above approach
class GFG{
 
// Function to return the required
// number of subarrays
static int findSubarrays(int arr[], int N,
                                    int K)
{
     
    // Return number of possible
    // subarrays of length K
    return N - K + 1;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 1, 5, 3, 2, 17, 18 };
    int K = 4;
    int N = arr.length;
 
    System.out.print(findSubarrays(arr, N, K));
}
}
 
// This code is contributed by shivanisinghss2110




# Python3 implementation of the
# above approach
 
# Function to return the required
# number of subarrays
def findSubarrays(arr, N, K):
     
    # Return number of possible
    # subarrays of length K
    return N - K + 1;
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 1, 5, 3, 2, 17, 18 ];
    K = 4;
    N = len(arr);
 
    print(findSubarrays(arr, N, K));
 
# This code is contributed by Rohit_ranjan




// C# implementation of the
// above approach
using System;
 
class GFG{
 
// Function to return the required
// number of subarrays
static int findSubarrays(int []arr, int N,
                                    int K)
{
     
    // Return number of possible
    // subarrays of length K
    return N - K + 1;
}
 
// Driver Code
public static void Main(String[] args)
{
    int []arr = { 1, 5, 3, 2, 17, 18 };
    int K = 4;
    int N = arr.Length;
 
    Console.Write(findSubarrays(arr, N, K));
}
}
 
// This code is contributed by Amit Katiyar




<script>
// Javascript implementation for the above approach
 
// Function to return the required
// number of subarrays
function findSubarrays(arr, N, K)
{
     
    // Return number of possible
    // subarrays of length K
    return N - K + 1;
}
 
    // Driver Code
     
    let arr = [ 1, 5, 3, 2, 17, 18 ];
    let K = 4;
    let N = arr.length;
 
    document.write(findSubarrays(arr, N, K));
 
</script>

Output: 
3

 

Time complexity: O(1) 
Auxiliary Space: O(1)
 


Article Tags :