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

淄博网站仿网站工具

淄博网站,仿网站工具,编程代码大全,贴吧友情链接在哪🌈键盘敲烂,年薪30万🌈 目录 普通版本的二分查找: right只负责控制边界(少了两次比较): 时间复杂度更稳定的版本: BSLeftmost: BSRightmost: 普通版本的二分查找: …

🌈键盘敲烂,年薪30万🌈

目录

普通版本的二分查找:

right只负责控制边界(少了两次比较):

时间复杂度更稳定的版本:

BSLeftmost:

BSRightmost:


 

普通版本的二分查找:

  • 🏸细节1:循环判定条件是left <= right
  • ⭐细节2:mid = (left + right ) >>> 1 原因见代码注释

/**** 二分查找的实现 3个版本* 时间复杂度:O(longn)* 空间复杂度:O(1)** 细节1:循环判定条件是left <= right* 细节2:mid计算要用 >>> 因为left + right 可能越界*      例如:right = Integer.MAX_INT-1 left = 0;*      第一轮计算没问题 假设mid < target*      left = mid + 1; 这是后left+ right 就超出int的最大范围,变成负数*      原因很简单:java没有无符号数,最高位表示符号位,/ 运算是先将补码转原码 >>>位运算是直接再二进制上运算*/
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index1 = method1(nums, target);System.out.println(target + "索引为" + index1);System.out.println(target + "索引为" + index2);}private static int method1(int[] nums, int target) {int left = 0, right = nums.length-1;while(left <= right){//细节 用无符号右移运算符int mid = (left + right) >>> 1;if(nums[mid] > target){right = mid - 1;}else if (nums[mid] < target){left = mid + 1;}else{return mid;}}return -1;}
}

right只负责控制边界(少了两次比较):

  • 改动1:while条件是left < right
  • 改动2:right = nums.length
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index2 = method2(nums, target);System.out.println(target + "索引为" + index2);}
}private static int method2(int[] nums, int target) {int left = 0, right = nums.length; //right 只代表有边界,不参与比较while(left < right){int mid = (left + right) >>> 1;if(nums[mid] < target){left = mid + 1;}else if(nums[mid] > target){right = mid;}else {return mid;}}return -1;}

时间复杂度更稳定的版本:

  • 细节:减少了if比较次数
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index3 = method3(nums, target);System.out.println(target + "索引为" + index3);}
}    private static int method3(int[] nums, int target) {//这个最牛逼//减少循环内的比较次数int left = 0, right = nums.length;while(1 < right - left){int mid = (left + right) >>> 1;if(nums[mid] > target){right = mid;}else{left = mid;}}if(nums[left] == target){return left;}return -1;}

BSLeftmost:

/**** 应用:求成绩排名  求前任*/
public class Leftmost {public static void main(String[] args) {int[] nums = {1,2,4,4,4,6,7};int target = 3;/**** params* return 找到了 - 返回靠左的下标*        没找到 - 返回>target的最靠左下标*/int ans = BSLeftmost(nums, target);System.out.println(ans);}private static int BSLeftmost(int[] nums, int target) {int left = 0, right = nums.length -1;while(left <= right){int mid = (left+right) >>> 1;if(target > nums[mid]){left = mid + 1;} else{right = mid - 1;}}return left;}
}

BSRightmost:

/**** 求后任*/
public class Rightmost {public static void main(String[] args) {int[] nums = {1,2,4,4,4,6,7};int target = 3;/*** return 找到了返回下标*        没找到返回 <= targer的最靠右索引**/int ans = BSRightmost(nums, target);System.out.println(ans);}private static int BSRightmost(int[] nums, int target) {int left = 0, right = nums.length-1;while(left <= right){int mid = (left + right) >>> 1;if(target >= nums[mid]){left = mid + 1;}else {right = mid - 1;}}return left - 1;}
}
http://www.yayakq.cn/news/343300/

相关文章:

  • 商城网站怎么做内链如何制作网页代码
  • 安徽建设局网站怎么查证件信息纪检部门网站举报建设
  • 南昌市,做网站的公司广告公司策划
  • 如何建个人摄影网站广告设计网上接单
  • 网站数据库设置权限wordpress只能显示字
  • 火车头wordpress建站群汽车类网站建设预算
  • 有什么平台可以做网站阿胶在那种网站做推广好
  • 网站建设首先某网站开发项目成本估计
  • 司法局网站建设自定义wordpress标题的分隔符
  • 免费的网站如何建设西安百度seo代理
  • 网站开发介绍ppt网站开发 请示
  • 云南工程建设总承包公司网站外贸建站cms
  • 关于医院网站建设的通知广西高端网站建设公司
  • 投资建设一个网站多少钱网站维护费用一般多少钱
  • wordpress网站如何迁移建筑公司名字起名大全2020最新
  • 保定学校网站建设计算机软件开发专业
  • 网站建设 模板百度seo培训课程
  • 网站建设需要提供什么太原自助建站软件
  • 我们常见的网站有哪些方面比wordpress
  • 优化图片传网站千图网免费设计图片素材网
  • 0基础网站建设教程凡科网建网站付费链接怎么做
  • 专业网站设计速寻亿企邦做钢材的网站有哪些
  • 衡水网站开发浙江省城乡和建设厅网站首页
  • 如何建设网站的能力大家都在哪些网站上做医药招商
  • 怎么查公司网站有没有中文域名摄影公司网站开发
  • 青阳做网站重庆网络公司产品设计
  • 南城微网站建设广西南宁时空网首页
  • 做食品网站需要什么资质会小二也是做会议网站的
  • 集宁网站建设网站建设用源码
  • 手机微信网站怎么做的好竞价托管哪家便宜