Guest User

Untitled

a guest
Dec 10th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<int> searchRange(vector<int>& nums, int target);
  6. int binarySearchMiddle(vector<int>& nums, int target);
  7. int binarySearchLeft(vector<int>& nums, int target);
  8. int binarySearchRight(vector<int>& nums, int target);
  9.  
  10. int main(int argc, char const *argv[])
  11. {
  12. vector<int> nums = {1,2,3,3,3,3,4,5,9};
  13. vector<int> range = searchRange(nums, 3);
  14. int left = range[0];
  15. int right = range[1];
  16. cout << left << ' ' << right << endl;
  17. return 0;
  18. }
  19.  
  20. vector<int> searchRange(vector<int>& nums, int target) {
  21. int middle = binarySearchMiddle(nums, target);
  22. if (middle == -1) {
  23. return vector<int>({-1, -1});
  24. }
  25.  
  26. vector<int> forLeftSearch(nums.begin(), nums.begin() + middle);
  27. vector<int> forRightSearch(nums.begin() + middle, nums.end());
  28. int left = binarySearchLeft(forLeftSearch, target);
  29. int right = binarySearchRight(forRightSearch, target);
  30.  
  31. if (left == -1) {
  32. left = middle;
  33. }
  34. if (right == -1) {
  35. right = middle;
  36. }
  37.  
  38. cout << middle << endl;
  39. return vector<int>({left, right + middle});
  40. }
  41.  
  42. int binarySearchMiddle(vector<int>& nums, int target) {
  43. int left = 0;
  44. int right = nums.size() - 1;
  45.  
  46. if (nums.size() == 0) {
  47. return -1;
  48. }
  49.  
  50. while (left <= right) {
  51. int mid = left + (right - left) / 2;
  52.  
  53. if (nums[mid] == target) {
  54. return mid;
  55. }
  56.  
  57. if (nums[mid] < target) {
  58. left = mid + 1;
  59. } else {
  60. right = mid - 1;
  61. }
  62. }
  63.  
  64. return -1;
  65. }
  66.  
  67. int binarySearchLeft(vector<int>& nums, int target) {
  68. int left = 0;
  69. int right = nums.size();
  70.  
  71. if (nums.size() == 0) {
  72. return -1;
  73. } else if (nums[left] == target) {
  74. return left;
  75. }
  76.  
  77. while (left < right) {
  78. int mid = left + (right - left) / 2;
  79.  
  80. if (nums[mid] != target && nums[mid + 1] == target) {
  81. return mid + 1;
  82. }
  83.  
  84. if (nums[mid] < target) {
  85. right = mid;
  86. } else {
  87. left = mid + 1;
  88. }
  89. }
  90.  
  91. if (nums[left] < nums.size() - 1 && nums[left] != target && nums[left + 1] == target) {
  92. return left;
  93. }
  94. return -1;
  95. }
  96.  
  97. int binarySearchRight(vector<int>& nums, int target) {
  98. int left = 0;
  99. int right = nums.size();
  100.  
  101. if (nums.size() == 0) {
  102. return -1;
  103. } else if (nums[right - 1] == target) {
  104. return right - 1;
  105. }
  106.  
  107. while (left < right) {
  108. int mid = left + (right - left) / 2;
  109.  
  110. if (nums[mid] != target && nums[mid + 1] == target) {
  111. return mid + 1;
  112. }
  113.  
  114. if (nums[mid] < target) {
  115. right = mid;
  116. } else {
  117. left = mid + 1;
  118. }
  119. }
  120.  
  121. if (nums[left] < nums.size() - 1 && nums[left] != target && nums[left + 1] == target) {
  122. return left;
  123. }
  124. return -1;
  125. }
Add Comment
Please, Sign In to add comment