二分查找
- 关键点
- 判断逻辑只有
if - else
- if条件中只能是单纯的
<
或>
,不能有等号 - 因为if中是单纯的大于或小于,对应的边界收缩就是
mid+1
或mid-1
- else中对应的边界收缩至
mid
- 跳出循环后左边界为搜索结果
- 判断逻辑只有
- 查找target最右边的位置。
int search(vector<int>& nums, int target) { if(nums.empty()) return -1; int l = 0, r = (int)nums.size() - 1; int mid; while(l < r){ mid = ceil(l + (r - l)/2.0); //1. 向右取整 if(nums[mid] > target){ //2. 单纯大于 r = mid - 1; //3. 边界排除 } else { //4. 只有if-else,没有其他分支 l = mid; } } if(nums[l] == target) return l; //左边界就是结果 return -1; }
- 查找target最左边的位置
int search(vector<int>& nums, int target) { if(nums.empty()) return -1; int l = 0, r = (int)nums.size() - 1; int mid; while(l < r){ mid = l + (r - l)/2; //1. 向左取整 if(nums[mid] < target){ //2. 单纯小于,确保最终定位一定是左边的target l = mid + 1; //3. 边界排除 } else { //4. 只有if-else,没有其他分支 r = mid; } } if(nums[l] == target) return l; //左边界就是结果 return -1; }
快速排序
- 参考博客
- 快速排序有两种写法,split和partition,倾向于使用第二种。
void quickSort(vector<int> &a, int begin, int end){ if(end - begin < 2) return; int l = begin, r = end-1; while(l < r){ //先移动右边界,确保最终停留位置的数是小于或等于a[begin]的 while(l < r && a[r] >= a[begin]) r--; while(l < r && a[l] <= a[begin]) l++; swap(a[l], a[r]); } swap(a[begin], a[l]); quickSort(a, begin, l); quickSort(a, l+1, end); }