当前位置: 首页 > news >正文

德州网站建设费用宁国市有做网站

德州网站建设费用,宁国市有做网站,wordpress批量发文章,成都装修设计公司首选我们可以总结出二分查找的通用做法和常见变种。二分查找是一种在有序数组中高效查找元素的算法,时间复杂度为 O (log n)。 二分查找的通用模板 二分查找的核心思想是将搜索范围不断缩小一半,直到找到目标元素或确定其不存在。以下是通用模板&#xff1…

我们可以总结出二分查找的通用做法和常见变种。二分查找是一种在有序数组中高效查找元素的算法,时间复杂度为 O (log n)。

二分查找的通用模板

二分查找的核心思想是将搜索范围不断缩小一半,直到找到目标元素或确定其不存在。以下是通用模板:

cpp

int binarySearch(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;  // 防止整数溢出if (nums[mid] == target) {return mid;  // 找到目标} else if (nums[mid] < target) {left = mid + 1;  // 目标在右半部分} else {right = mid - 1;  // 目标在左半部分}}return -1;  // 未找到目标
}

常见变种及处理技巧

1. 查找插入位置(第一个大于等于目标的位置)
  • 特点:返回第一个大于等于target的索引,若所有元素都小于target,则返回数组长度。
  • 关键:循环结束时,left指向第一个大于等于target的位置。

cpp

int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;  // 最终left即为插入位置
}
2. 二维矩阵查找
  • 特点:将二维矩阵展开为一维有序数组。
  • 关键:计算一维索引对应的二维坐标。

cpp

bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();int left = 0, right = m * n - 1;while (left <= right) {int mid = left + (right - left) / 2;int row = mid / n, col = mid % n;  // 转换为二维坐标if (matrix[row][col] == target) {return true;} else if (matrix[row][col] < target) {left = mid + 1;} else {right = mid - 1;}}return false;
}
3. 查找元素的第一个和最后一个位置
  • 特点:需要两次二分查找,分别找到左边界和右边界。
  • 关键
    • 左边界:第一个大于等于target的位置。
    • 右边界:第一个大于target的位置减 1。

cpp

vector<int> searchRange(vector<int>& nums, int target) {auto lower = [&](int t) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < t) {left = mid + 1;} else {right = mid - 1;}}return left;};int first = lower(target);if (first >= nums.size() || nums[first] != target) {return {-1, -1};}int last = lower(target + 1) - 1;  // 右边界return {first, last};
}
4. 旋转排序数组中的查找
  • 特点:数组被旋转后,左右半部分仍有序,但整体无序。
  • 关键:通过比较nums[mid]nums[0]的关系,确定哪半部分有序,再根据有序部分缩小范围。

cpp

int search(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}if (nums[0] <= nums[mid]) {  // 左半部分有序if (target >= nums[0] && target < nums[mid]) {right = mid - 1;  // 目标在左半部分} else {left = mid + 1;  // 目标在右半部分}} else {  // 右半部分有序if (target > nums[mid] && target <= nums.back()) {left = mid + 1;  // 目标在右半部分} else {right = mid - 1;  // 目标在左半部分}}}return -1;
}
5. 寻找旋转排序数组中的最小值
  • 特点:最小值是旋转点,左侧元素都大于右侧元素。
  • 关键:比较nums[mid]与最右侧元素的大小,确定旋转点位置。

cpp

int findMin(vector<int>& nums) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] <= nums[right]) {  // 最小值在左侧right = mid - 1;} else {  // 最小值在右侧left = mid + 1;}}return nums[left];  // 最终left指向最小值
}

二分查找的关键点总结

  1. 循环条件:通常为left <= right,确保不漏掉最后一个元素。
  2. 中间索引计算:使用mid = left + (right - left) / 2防止整数溢出。
  3. 边界调整
    • 若目标在右侧,left = mid + 1
    • 若目标在左侧,right = mid - 1
  4. 变种处理
    • 查找左边界:找到第一个大于等于target的位置。
    • 查找右边界:找到第一个大于target的位置减 1。
    • 旋转数组:通过比较nums[mid]与边界元素,确定有序部分。

掌握这些技巧后,可以灵活应对各种二分查找的变种问题。

http://www.dtcms.com/a/477317.html

相关文章:

  • 顺德品牌网站建设咨询建设宠物网站的可行性
  • 网站的惩罚期要怎么做苏州网站建设优化
  • 给公司做网站需要什么信息淘宝网站怎么做的好
  • 网站硬件需求淘客网站代理
  • 网站转发代码简单大气网站源码
  • 手机网站制作的公司滁州市建设局网站
  • 怎么建设手机网站首页邢台网站建设服务商
  • 春考网站建设wordpress svg
  • wordpress 网站禁用全屏代码医疗网站建设策划书
  • 高级室内设计网站织梦网站地图怎么做xml
  • 网站建设的步骤过程视频vR网站建设程序
  • 西安制作网站的公司有wordpress检测替换
  • 铭讯网站建设宁波网站建设团队
  • 一 网站建设的总体目标移动网站在线开发工具
  • 福田区建设局网站富阳区建设局网站多少
  • 金融公司网站免费模板wordpress修改生效
  • iis网站权限个人怎样申请注册公司
  • wordpress防站建设银行官方网站个人
  • 2018年淘宝客网站怎么做微信群营销工具
  • 性做网站移动的网络网站建设
  • 平阳网站优化站长统计性宝app
  • wordpress快站网站开发类论文题目
  • 网站中英文转换js品牌营销推广要怎么做
  • 郑州高校网站建设服务公司企业网站备案怎么搞
  • php网站框架动漫制作专业电脑配置要求
  • 阳江网站设计微信聚合聊天crm系统
  • 中国四大门户网站分别是东营免费网站制作
  • 江门网站建设方案外包阿里云怎么放多个网站
  • 网站创建风格电子商务官方网站
  • 网站更改logo嘉兴备案网站