Guest User

Untitled

a guest
Nov 24th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. using System;
  2.  
  3. class Solution
  4. {
  5. public static int ShiftedArrSearch(int[] shiftArr, int num)
  6. {
  7. if(shiftArr == null || shiftArr.Length == 0)
  8. {
  9. return -1;
  10. }
  11.  
  12. return runModifiedBinarySearch(shiftArr, num, 0, shiftArr.Length - 1);
  13. }
  14.  
  15. /// try to find half with ascending order
  16. private static int runModifiedBinarySearch(int[] numbers, int search, int start, int end)
  17. {
  18. if(start > end )
  19. {
  20. return -1;
  21. }
  22.  
  23. int middle = start + (end - start)/ 2;
  24. bool found = numbers[middle] == search;
  25.  
  26. if(found)
  27. {
  28. return middle;
  29. }
  30.  
  31. var middleValue = numbers[middle];
  32. var startValue = numbers[start];
  33. var endValue = numbers[end];
  34.  
  35. var firstHalfAscending = startValue < middleValue; // [9, 12, 17, 2, 4, 5], 9 < 17
  36. //ar secondHalfAscending = middleValue < endValue;
  37. // 53,90,2,3,4,5,6,8,9,10 -> 90
  38. // start = 0 , end = 9, middle = 4 , middleValue = 4,
  39. if(firstHalfAscending) // 53 < 4 false
  40. {
  41. var isInFirstHalfRange = search >= startValue && search < middleValue;
  42. if(isInFirstHalfRange)
  43. {
  44. return runModifiedBinarySearch(numbers, search, start, middle - 1);
  45. }
  46. else
  47. {
  48. return runModifiedBinarySearch(numbers, search, middle + 1, end);
  49. }
  50. }
  51.  
  52. var isInSecondHalfRange = search > middleValue && search <= endValue; // [4, 10]
  53. if(isInSecondHalfRange)
  54. {
  55. return runModifiedBinarySearch(numbers, search, middle + 1, end);
  56. }
  57. else
  58. {
  59. return runModifiedBinarySearch(numbers, search, start, middle - 1); // 0, 3, [53, 90, 1, 2]
  60. }
  61. }
  62.  
  63. static void Main(string[] args)
  64. {
  65.  
  66. }
  67. }
  68.  
  69. // 1, 2, 3, 4, 5
  70. // 3, 4, 5, 1, 2 -> [3, 4, 5] and second part [1, 2], k = 2
  71. // special case k = 0
  72. // given num, try to find index of num -> binary search -> O(logn)
  73. // O(n) - brute force
  74. // special modified binary search
  75. // [9, 12, 17, 2, 4, 5] -> 17 > 2 , call 2 is pivot position
  76. // size = 6, middle 0 - 5 , 2, 17 , [9, 12, 17] -> ascending order -> [17, 2, 4, 5] descending -> pivot
  77. // 2 -> start value -> search -> binary search
Add Comment
Please, Sign In to add comment