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

制作图网官网北京搜索引擎优化管理专员

制作图网官网,北京搜索引擎优化管理专员,做网站有什么书,青海省网站建设哪家公司比较靠谱【算法题解答一】二分法 接上文 【算法方法总结一】二分法的一些技巧和注意事项 二分法相关题目如下: 34.在排序数组中查找元素第一和最后一个位置 使用 左闭右闭,[left,right]关键在于 nums[mid] target 的部分找 第一个 target 的过程中&#xff0…

【算法题解答·一】二分法

接上文 【算法方法总结·一】二分法的一些技巧和注意事项


二分法相关题目如下:

34.在排序数组中查找元素第一和最后一个位置

  • 使用 左闭右闭[left,right]
  • 关键在于 nums[mid] == target 的部分
  • 第一个 target 的过程中,如果 nums[mid] == target,说明 mid 已经满足条件,但 mid 前面 可能还有相同的 target,把 right 更新为mid - 1,继续往 mid 找;
  • 最后一个 target 的过程中,如果 nums[mid] == target,说明 mid 已经满足条件,但 mid 后面 可能还有相同的 target,把 left 更新为mid + 1,继续往 mid 找。
class Solution {public int[] searchRange(int[] nums, int target) {int[] ans = new int[] { -1, -1 }; // 存结果 {第一,最后}int len = nums.length;if (len == 0) return ans;int left = 0, right = len - 1; // 左闭右闭// 找第一个 target,普通的二分查找while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {ans[0] = mid; // 找到后填入ans[0]中right = mid - 1; // 往 mid 前继续找} else if (nums[mid] > target) {right = mid - 1;} else { // nums[mid] < targetleft = mid + 1;}}// 重新初始化left = 0;right = len - 1;// 找最后一个 target,普通的二分查找while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {ans[1] = mid; // 找到后填入ans[1]中left = mid + 1; // 往 mid 后继续找} else if (nums[mid] > target) {right = mid - 1;} else { // nums[mid] < targetleft = mid + 1;}}return ans;}
}

35.搜索插入位置简单

  • 使用 左闭右开[left,right)
class Solution {public int searchInsert(int[] nums, int target) {int n = nums.length;// 左闭右开,[left,right)int l = 0, r = n;while (l < r) {int mid = l + (r - l) / 2;if (target == nums[mid]) {return mid;} else if (target > nums[mid]) {l = mid + 1;} else {r = mid;}}return l; // 如果不知道返回什么,可以自己模拟一下}
}

74.搜索二维矩阵

  • 使用 左闭右开[left,right)
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;// 有序,所以使用二分搜索,[left,right)int l = 0, r = n * m;while (l < r) {int mid = l + (r - l) / 2;int x = mid / n; // 行索引int y = mid % n; // 列索引if (matrix[x][y] == target) {return true;} else if (matrix[x][y] > target) {r = mid;} else {l = mid + 1;}}return false; // 循环结束还没返回 true,说明没有找到,直接返回 false}
}

33.搜索旋转排序数组

  • 使用 左闭右闭[left,right]
  • 第一类 2 3 4 5 6 7 | 1 这种,也就是 nums[l] <= nums[mid]。此例子中是 2 <= 5。这种情况下,前半部分有序。如果 nums[l] <= target < nums[mid],则在前半部分找,否则去后半部分找。
  • 第二类 6 7 | 1 2 3 4 5 这种,也就是 nums[l] > nums[mid]。此例子中就是 6 > 2。这种情况下,后半部分有序。如果 nums[mid] < target <= nums[r],则在后半部分找,否则去前半部分找。
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while (l <= r) {int mid = l + (r - l) / 2;if (nums[mid] == target) {return mid;}// 前半段有序,后半段无序if (nums[l] <= nums[mid]) {// target 在前半段if (target >= nums[l] && target < nums[mid]) {r = mid - 1;} else { // target 在后半段l = mid + 1;}} else { // 前半段无序,后半段有序// target 在后半段if (target <= nums[r] && target > nums[mid]) {l = mid + 1;} else { // target 在前半段r = mid - 1;}}}return -1; // 没有找到 target}
}

153.寻找旋转排序数组中的最小值

在这里插入图片描述

  • 使用 左闭右开[left,right)
class Solution {public int findMin(int[] nums) {int l = 0, r = nums.length;while (l < r) {int mid = l + (r - l) / 2;// 断崖最小值在mid右边if (nums[mid] > nums[nums.length - 1]) {l = mid + 1; // 往右半段找} else { // 断崖最小值在mid左边,或为midr = mid; // mid也有可能是最小值}}return nums[l];}
}

4.寻找两个正序数组的中位数困难

暴力法很简单,但是二分法很有难度,先挖个坑之后填

http://www.dtcms.com/wzjs/206694.html

相关文章:

  • 可以做微课ppt模板 网站有哪些内容国外搜索引擎大全
  • 湘潭外包网络推广公司seo准
  • 音乐摄影网站建设宗旨自助建站系统平台
  • wap网站设计电商网站如何避免客户信息泄露
  • 中建八局第一建设有限公司电话成都自然排名优化
  • 透明度 宁波政府网站建设百度搜索工具
  • 手机网站开发相关问题凡科小程序
  • 门户网站建设招标方公司网站设计
  • 哈尔滨快速建站案例软文营销的三个层面
  • 比价网站怎么做怎么创建网页链接
  • 制作企业网站页面html私域流量和裂变营销
  • 北京高端网站建设咸阳4p营销理论
  • 电子商务网站建设的核心硬件最经典的营销案例
  • 网站开发语言net亿驱动力竞价托管
  • phpcms 网站标题线上营销活动方案
  • 购物网站支付页面制作互联网公司排名
  • 想学网络营销网站建设免费seo教程资源
  • 做网站一般用什么几号字全自动推广引流软件免费
  • mvc5 网站开发美學 pdfseo免费培训教程
  • 自己做b2b平台网站建设推广app用什么平台比较好
  • 大型网站开发用什么语言百度快速收录技术
  • 建设企业网站的目的营销网页
  • 南宁做网站优化整合营销网络推广
  • 浏览器一打开就是2345网址导航seo优化外链平台
  • 长沙网站改版赣州网站建设公司
  • 申请注册邮箱163免费注册seo优化教程自学
  • 云南网站开发建设外贸推广引流
  • 织梦做的网站怎样百度快速优化推广
  • 网站程序0dayseo排名优化技术
  • wordpress整合问答系统seo的理解