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

哈尔滨模板建站系统本地做网站图片怎么存

哈尔滨模板建站系统,本地做网站图片怎么存,网站建设评审会总结发言,班级建设网站首页代码随想录Day1 数组 二分查找 力扣704.二分查找 二分查找有几个最重要的特点: 对于需要用到”二分查找“的数组来说(即用二分查找来找到确切的某一个元素),这个数组中的元素不能重复; 被操作的数组一定要是有序的…

代码随想录Day1

数组

二分查找

力扣704.二分查找

二分查找有几个最重要的特点:

  1. 对于需要用到”二分查找“的数组来说(即用二分查找来找到确切的某一个元素),这个数组中的元素不能重复;

  2. 被操作的数组一定要是有序的,如果没有排好序,则需要先排好序再使用二分查找。

class Solution {public int search(int[] nums, int target) {int left=0;int right=nums.length-1;while(left<=right){//这里最好不要使用(left+right)/2,因为有越界的风险存在int mid=left+(right-left)/2;if(target<nums[mid]){right=mid-1;}else if(target>nums[mid]){left=mid+1;}else{return mid;}}return -1;}
}

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

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

注: 此题体现出二分查找另一个最重要的作用,找出某个元素的”边界“

class Solution {public int[] searchRange(int[] nums, int target) {int left=0;int right=nums.length-1;//数组为中没有元素,或者目标值根本不可能存在(即小于数组最小值或者大于数组最大值/*这里有两点要注意:1、根据题意,输入的数组不为null,而是没有元素。(表示数组为null的写法为 nums==null,但是此题要写为nums.length==02、nums.length==0 必须要写在最前面。根据||的使用规则,如果将target>nums[right]写在最前面,会直接报错。(因为如果nums.length==0  那么right此时就是-1)*/if(nums.length==0 || target<nums[left] || target>nums[right])return new int[]{-1,-1};int leftBorder=-1,rightBorder=-1;leftBorder=getLeftBorder(nums,target);rightBorder=getRightBorder(nums,target);if(rightBorder-leftBorder>1)return new int[]{leftBorder+1,rightBorder-1};else return new int[]{-1,-1};}int getRightBorder(int[] nums, int target){int left=0;int right=nums.length-1;int rightBorder=-1;while(left<=right){int mid=left+(right-left)/2;if(target<nums[mid]){right=mid-1;}else{left=mid+1;rightBorder=left;}}return rightBorder;}int getLeftBorder(int[] nums, int target){int left=0;int right=nums.length-1;int leftBorder=-1;while(left<=right){int mid=left+(right-left)/2;if(target>nums[mid]){left=mid+1;}else{right=mid-1;leftBorder=right;}}return leftBorder;}}

最抽象的是getRightBorder()方法以及getLeftBorder()方法

  • 如果暂且忽略掉上面两个方法中的leftBorder、rightBorder变量,而仅是观察两方法的写法,大体上与二分查找相似,唯一不同点在于(拿getLeftBorder()方法为例):
//其关键代码为:
while(left<=right){int mid=left+(right-left)/2;if(target>nums[mid]){left=mid+1;}else{right=mid-1;leftBorder=right;}
}//略微再多改写一下也就是while(left<=right){int mid=left+(right-left)/2;if(target>nums[mid]){left=mid+1;}else if(traget<nums[mid]){right=mid-1;    leftBorder=right;}
/*以上两个就跟二分查找一样了,当target>nums[mid]   left=mid+1;  当target<nums[mid] right=mid-1
*/
//但是! 下面这种情况,target==nums[mid]的时候,为什么还是right=mid-1,并且leftborder=right;
//个人理解:因为left是一直往右移动的,right是一直往左移动的。找左边界,只能是右‘指针’往左走。并且在while(left<=right)的条件下,如果target确实存在于nums中的话,left与right一定是不包含target的下标的。else{right=mid-1;leftBorder=right; }}

其次:为什么一定要if(rightBorder-leftBorder>1);才 return new int[]{leftBorder+1,rightBorder-1}; 即表示这为什么一定是rightBorder-leftBorder>1 才表示target确实在nums中存在?

  • 如果target只有一个,且下标为5,那么求出来的rightBorder为6,leftBorder为4。6-4>1 显然正确。
  • 如果target根本不存在于nums,可以想见,最后left、right、mid都指向同一个元素,而这个元素不可能同时满足大于并小于target,所以这个时候不是left+1 就是 right-1,最终rightBorder-leftBorder==1。 确实没有大于1
http://www.15wanjia.com/news/192271.html

相关文章:

  • 做一个页面网站需要多少钱网站备案号格式说明书
  • 阿里云备案网站备案域名中明建投建设集团 网站
  • 商城网站建设怎么收费做网站数据需要的软件
  • 免费金融发布网站模板下载长安东莞网站设计
  • 凉山彝族自治州网站建站如何查注册商标是别人注册过的
  • 企业网站建设联系电话织梦教育培训网站源码
  • 张家口建设部网站福建建设工程交易中心网站
  • 做网站的要多钱wordpress 图灵机器人
  • 手机传奇手游发布网站鄂州网站建设网络公司
  • 特色专业建设展示网站打开陕西建设厅网站
  • 中远智达网站建设辽宁工程招投标信息网
  • 招聘网站推广怎么做天津网站制作南昌
  • 万网网站建设方案书手机网站怎么改成电脑版
  • 如何部署thinkphp网站网站域名的用处
  • 快站淘客网站开发快速盈利
  • 网站常用的一种js幻灯片h5网站和传统网站
  • 定制网站和模板网站及仿站的区别广州招聘网站制作
  • 企业营销型网站建设品牌网站开发完要怎么部署
  • wordpress自定义文章类型分类模板嘉兴网站seo公司
  • 设计网站属于什么专业南岸集团网站建设
  • 网站建设歺首选金手指12诸暨哪些公司可以制作网站
  • 做哪个网站的推广最好wordpress改主题幻灯片尺寸
  • wordpress 云教育seo体系
  • 做网站运营有前景么网站wap怎么做
  • 厦门seo网站推广宁波网站优化公司电话
  • 浪子做的阿哲喊麦网站多少wordpress支持系统
  • 功能主机网站无忧网站建设哪家便宜
  • 网上学习做网站永久免费的网络加速器
  • 沈阳市有做网站的公司Https全局wordpress
  • 教育类网站 前置审批马上飞做的一些网站