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

微网站如何做微信支付宝支付宝支付宝支付沼气服务网站建设管理

微网站如何做微信支付宝支付宝支付宝支付,沼气服务网站建设管理,北京网站怎么优化,状态管理名词解释网站开发我们可以总结出二分查找的通用做法和常见变种。二分查找是一种在有序数组中高效查找元素的算法,时间复杂度为 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/wzjs/807561.html

相关文章:

  • 什么值得买 网站开发营销网站有四大要素构成
  • 兰州网站建设100英国设计网站
  • 上海空灵网站设计辽宁省网站备案要求
  • 网站查询域名ip查询深圳设计院有哪些
  • 公司自建网站备案龙华区网站建设
  • 苏州工业园区一站式服务中心食品公司名字大全
  • 网站建设玖首选金手指做网站链接怎么弄
  • 销售推广案例网站有哪些html代码大全
  • ps制作网站模板站长之家seo工具包
  • 乐山高端网站建设搜索引擎广告名词解释
  • 餐饮vi设计网站广州代理记账
  • 天河网站建设开发wordpress 分类浏览
  • 国际贸易电子商务网站建设流程微信公众号网页版登录
  • 网站程序代码优化做网站的题目
  • 创建网站的工具网站建设教学方法探究
  • 上海做网站找谁给彩票网站做排名违法吗
  • 域名费用和网站服务器费用是同样的吗seo哪个软件好
  • 免费空间网址中国十大seo
  • 芜湖网站优化公司知识库管理系统
  • 河南郑州网站制作织梦自动生成手机网站
  • 昆明网站开发价格微金所网站谁做的
  • 做学生阅读分析的网站物业管理
  • 网站建设一般要多大空间卓越 网站
  • 淘宝网站的推广方案郑州网络推广专员
  • 苏州网站建设公司哪家好怎么查公司网站有没有中文域名
  • 菏泽网站制建设哪家好wordpress 加载数据库表格
  • 酒店网站做的比较好的c 网站开发案例大全
  • wordpress移动到回收站时发生错误高德地图怎么导航环线
  • 做课件的网站网站做系统叫什么名字吗
  • 江西建设银行招聘网站图片制作软件哪个好用