Given a sorted array, this array is rotated by some unknown times. Find if there is a pair in this array
that sums to a given value.
Solution 1. O(n * log n) runtime, sort this array then use two pointers to check if there is a pair.
Solution 2. O(n) runtime, rotate this array back to its sorted order then use two pointers to check if there is a pair.
How to rotate: first find the split point where the natural order is broke; then apply the 3-step rotation algorithm.
Solution 3. optimal: O(n) runtime, two pointers without modifying the given array.
1 public boolean checkPairSum(int[] arr, int target) { 2 if(arr == null || arr.length < 2) { 3 return false; 4 } 5 int end = 0, start = 0; 6 for(; end < arr.length - 1; end++) { 7 if(arr[end] > arr[end + 1]) { 8 break; 9 } 10 } 11 start = (end + 1) % arr.length; 12 while(start != end) { 13 int sum = arr[start] + arr[end]; 14 if(sum == target) { 15 return true; 16 } 17 else if(sum < target) { 18 start = (start + 1) % arr.length; 19 } 20 else { 21 end = (end - 1 + arr.length) % arr.length; 22 } 23 } 24 return false; 25 }