1. 程式人生 > >【LeetCode & 劍指offer刷題】查詢與排序題8:Search for a Range

【LeetCode & 劍指offer刷題】查詢與排序題8:Search for a Range

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

Search for a Range

Given an array of integers   nums   sorted in ascending order, find the starting and ending position of a given   target   value. Your algorithm's runtime complexity must be in the order of
  O (log   n ). If the target is not found in the array, return   [-1, -1] . Example 1: Input: nums = [ 5,7,7,8,8,10] , target = 8 Output: [3,4]
Example 2: Input: nums = [ 5,7,7,8,8,10] , target = 6 Output: [-1,-1]
C+   類似: 53 數字在排序陣列中出現的次數
/*問題:在有序陣列中查詢目標值出現的範圍 方法:對於有序序列用二分查詢 使用stl中lower_bound和upper_bound函式 O(logn) */ class Solution { public :     vector < int > searchRange ( vector < int >& nums , int target )     {         if ( nums . empty ()) return vector < int >{- 1 ,- 1 }; // 容器為空時 vector<int>{} 為初始化返回容器操作)               //lower_bound 找到後返回第一個大於等於 target 的位置的迭代器,否則返回迭代器 end         vector < int >:: iterator start = lower_bound ( nums . begin (), nums . end (), target );         //upper_bound 找到後返回第一個大於 target 的位置的迭代器,否則返回迭代器 end         vector < int >:: iterator end = upper_bound ( nums . begin (), nums . end (), target );                 if ( start == end || start == nums . end ()) // 相等時,說明找到的是大於目標值的數,指向 end 時說明目標值比陣列所有元素大,兩種情況下均為沒有找到             return {- 1 ,- 1 };         else             return {start-nums.begin(), end-nums.begin()-1};     } };   /* //或者自己實現 class Solution { public: vector<int> searchRange(vector<int>& nums, int target) {     vector<int> result;     int begin = 0;     int end = nums.size() - 1;     int start_index = -1;     int end_index = -1;     //locate the start_index     while (begin <= end){         int mid = (begin + end) / 2;         if (nums[mid] == target){             if (mid - 1<0 || nums[mid - 1] != target){                 start_index = mid;                 break;             }             else{                 end = mid - 1;             }         }         else if (nums[mid]>target){             end = mid - 1;         }         else{             begin = mid + 1;         }     }     //locate the end_index     begin = 0;     end = nums.size() - 1;     while (begin <= end){         int mid = (begin + end) / 2;         if (nums[mid] == target){             if (mid + 1>nums.size() - 1 || nums[mid + 1] != target){                 end_index = mid;                 break;             }             else{                 begin = mid + 1;             }         }         else if (nums[mid]>target){             end = mid - 1;         }         else{             begin = mid + 1;         }     }     //cout << start_index << " " << end_index << endl;     result.push_back(start_index);     result.push_back(end_index);     return result; } }; */