fork(3) download
  1. using System;
  2.  
  3. public class Test
  4. {
  5. public static int FindPivot(int[] array)
  6. {
  7. var i = 0;
  8. var j = array.Length - 1;
  9. var ans = 1<<20;
  10. var idx = 1<<20;
  11.  
  12. while (i < j)
  13. {
  14. var mid = i + (j - i) / 2 + 1;
  15. // Console.WriteLine(String.Format("{0}, {1}, {2}", i, mid, j));
  16.  
  17. if (array[mid] < array[array.Length - 1])
  18. {
  19. if(array[mid] < ans || (array[mid] == ans && mid < idx)) { ans = array[mid]; idx = mid;}
  20. j = mid - 1;
  21. }
  22. else if (array[mid] > array[array.Length - 1])
  23. {
  24. i = mid;
  25. }
  26. else
  27. {
  28.  
  29. // Here did not consider case if array[i] < mid
  30. if(array[j] < ans || (array[j] == ans && j < idx)) { ans = array[j]; idx = j;}
  31. if(array[i] < ans || (array[i] == ans && i < idx)) { ans = array[i]; idx = i;}
  32. if (array[mid] == array[j])
  33. {
  34. j--;
  35. }
  36. if (array[mid] == array[i])
  37. {
  38. i++;
  39. }
  40. }
  41. }
  42. if(array[j] < ans || (array[j] == ans && j < idx)) { ans = array[j]; idx = j;}
  43. if(array[i] < ans || (array[i] == ans && i < idx)) { ans = array[i]; idx = i;}
  44. Console.WriteLine("Minimum = " + ans);
  45. return idx;
  46. }
  47.  
  48. public static void Main()
  49. {
  50. int []a = {7,7,7,7,8,8,9,9,1,2,2,2,7,7};
  51. int []b = {3,3,1,3,3,3,3,3};
  52. int []c = {1,2,3,4};
  53. int []d = {4,4,4,4};
  54. int []e = {3,3,3,3,3,3,3,1,3};
  55. int []f = {4,5,6,7,1,1,1,1};
  56. Console.WriteLine(FindPivot(a));
  57. Console.WriteLine(FindPivot(b));
  58. Console.WriteLine(FindPivot(c));
  59. Console.WriteLine(FindPivot(d));
  60. Console.WriteLine(FindPivot(e));
  61. Console.WriteLine(FindPivot(f));
  62. }
  63. }
Success #stdin #stdout 0.01s 131776KB
stdin
Standard input is empty
stdout
Minimum = 1
8
Minimum = 1
2
Minimum = 1
0
Minimum = 4
0
Minimum = 1
7
Minimum = 1
4