![]() |
VOOZH | about |
Given an array arr[] of n numbers and an integer k, find length of the minimum sub-array with gcd equals to k.
Example:
Input: arr[] = {6, 9, 7, 10, 12,
24, 36, 27},
K = 3
Output: 2
Explanation: GCD of subarray {6,9} is 3.
GCD of subarray {24,36,27} is also 3,
but {6,9} is the smallest
Note: Time complexity analysis of below approaches assume that numbers are fixed size and finding GCD of two elements take constant time.
Find GCD of all subarrays and keep track of the minimum length subarray with gcd k. Time Complexity of this is O(n3), O(n2) for each subarray and O(n) for finding gcd of a subarray.
Method 2
Find GCD of all subarrays using segment tree based approach discussed here. Time complexity of this solution is O(n2logn), O(n2) for each subarray and O(logn) for finding GCD of subarray using segment tree.
Method 3
The idea is to use Segment Tree and Binary Search to achieve time complexity O(n (logn)2).
Following is the implementation of above idea.
Size of smallest sub-array with given size is 2
Example:
arr[] = {6, 9, 7, 10, 12, 24, 36, 27}, K = 3
// Initial value of minLen is equal to size
// of array
minLen = 8
No element is equal to k so result is either
greater than 1 or doesn't exist. First index
Second Index
.
.
.
Sixth Index
Time Complexity: O(n (logn)2), O(n) for traversing to each index, O(logn) for each subarray and O(logn) for GCD of each subarray.
Space Complexity : O(1)