【演算法】【二分】Leetcode二分問題總結
阿新 • • 發佈:2020-08-23
在排序陣列中查詢數字
題目連結:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
class Solution { public: int search(vector<int>& nums, int target) { int n = nums.size() - 1; int l = 0; int r = n; while(l < r) { int mid = l + r >> 1; if(nums[mid] >= target) r = mid; else l = mid + 1; } cout << r << endl; int res = 0; int i = l; while(i <= n && nums[i++] == target) res++; return res; } };
搜尋旋轉排序陣列
題目連結:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
class Solution { public: int search(vector<int>& nums, int target) { int n = nums.size(); if(n == 0) return -1; int l = 0, r = n - 1; while(l < r) { int mid = (l + r + 1) >> 1; if(nums[mid] >= nums[0]) l = mid; else r = mid - 1; } if (target >= nums[0]){ // left l = 0; } else { // right l = r + 1; r = n - 1; } while(l < r) { int mid = (l + r) >> 1; if(nums[mid] >= target) r = mid; else l = mid + 1; } return nums[r] == target ? r : -1; } };
在排序陣列中查詢元素的第一個和最後一個位置
題目連結:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.size() == 0) return {-1, -1}; vector<int> res(2, -1); res[0] = left(nums, target); res[1] = right(nums, target); return res; } int left(vector<int>& nums, int target) { int n = nums.size(); int l = 0, r = n - 1; while(l < r) { int mid = (l + r) >> 1; if(nums[mid] >= target) r = mid; else l = mid + 1; } return target != nums[l] ? -1 : l; } int right(vector<int>& nums, int target) { int n = nums.size(); int l = 0, r = n - 1; while(l < r) { int mid = (l + r + 1) >> 1; if(nums[mid] <= target) l = mid; else r = mid - 1; } return target != nums[l] ? -1 : l; } };