From a352a4905e3965eb45dbea3e79bab7af653fe1a0 Mon Sep 17 00:00:00 2001 From: Nirmalya Misra <39618712+nirmalya8@users.noreply.github.com> Date: Mon, 4 Oct 2021 11:21:10 +0530 Subject: [PATCH] Add algorithm for how many times an array has been rotated in O(log N) (#2448) --- Searches/howManyTimesRotated.java | 66 +++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Searches/howManyTimesRotated.java diff --git a/Searches/howManyTimesRotated.java b/Searches/howManyTimesRotated.java new file mode 100644 index 000000000..487df2e51 --- /dev/null +++ b/Searches/howManyTimesRotated.java @@ -0,0 +1,66 @@ +/* + Problem Statement: + Given an array, find out how many times it has to been rotated + from its initial sorted position. + Input-Output: + Eg. [11,12,15,18,2,5,6,8] + It has been rotated: 4 times + (One rotation means putting the first element to the end) + Note: The array cannot contain duplicates + + Logic: + The position of the minimum element will give the number of times the array has been rotated + from its initial sorted position. + Eg. For [2,5,6,8,11,12,15,18], 1 rotation gives [5,6,8,11,12,15,18,2], 2 rotations [6,8,11,12,15,18,2,5] and so on. + Finding the minimum element will take O(N) time but, we can use Binary Search to find the mimimum element, we can reduce the complexity to O(log N). + If we look at the rotated array, to identify the minimum element (say a[i]), we observe that a[i-1]>a[i]a[mid-1] && a[mid]a[mid-1] && a[mid]>a[mid+1]) + { + low = mid-1; + } + } + + return mid; + } +}