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

便宜的购物网站排名如何修改百度上面的门店号码

便宜的购物网站排名,如何修改百度上面的门店号码,便宜做网站的公司哪家好,网页响应式一、题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示…

一、题目描述

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例:

输入:nums = [5,7,7,8,8,10],target = 8

输出:[3, 4]

输入:nums = [5,7,7,8,8,10],target = 6

输出:[-1, -1]

输入:nums = [ ],target = 0

输出:[-1, -1]

二、题解

思路分析:

题目要求我们找到出现target的第一个位置和最后一个位置,首先,我们想到可以通过暴力枚举的方法来解决该问题,即遍历数组,并记录target第一次出现和最后一次出现的位置。然而,题目要求我们实现时间复杂度为O(log n)的算法,且题目中给出的数组为非递减的数组,因此,我们可以考虑使用二分查找的方法来解决该问题

由于题目中数据量较小,使用遍历的方法也可以通过该题

遍历代码:

class Solution {public int[] searchRange(int[] nums, int target) {int first = -1;int last = -1;boolean flg = false;//判断是否是第一个位置for (int i = 0; i < nums.length; i++) {//第一个位置if(nums[i] == target && !flg){first = i;flg = true;}//最后一个位置//注意处理特殊情况,即最后一个元素在最后一个位置时,nums[i+1]越界if(nums[i] == target && (i == nums.length - 1 || nums[i+1] != target)){last = i;}}int[] ret = {first,last};return ret;}
}

如何使用二分查找来解决该问题?

题目要求我们找到target在数组中第一次出现和最后一次出现的位置,利用数组非递减的性质

首先我们查找元素的第一个位置:

 我们可通过target将数组分为两部分

其中,左边部分为小于target的元素,右边部分为大于等于target的元素,由于右边区域大于等于target,因此区域最左边的值即为target第一次出现的位置,即右边区域的左端点为所求结果

我们定义left指向0位置,right指向最后一个元素,mid指向中间位置

若mid指向的元素落在右边区间,此时nums[mid]大于等于target,需要更新right的值,由于要找的结果(target第一次出现的位置)在此区间内,即mid所指向的位置可能就是最终结果,因此不能将right更新为mid - 1,而应更新为mid

若mid所指向的元素落在左边区间,此时nums[mid]小于target,需要更新 left 的值,由于要找的结果不在此区间内,因此可将left的结果更新为 mid + 1

 当left和right之间元素为偶数个时,此时中间元素有两个,应该选择哪一个作为中间元素?

由于我们查找的是右边区间内最左边的元素,因此,应该选择左边的元素作为中间元素

若选择右边元素作为中间元素,能够成功查找到结果吗? 

当选择右边元素作为中间元素时,此时会出现死循环的情况,例如: 

 上图中,当选择右边元素作为中间元素时,mid指向的元素落在右边区间,此时将right更新为mid,再求mid,此时mid仍为指向刚才位置,即落在右边区间,此时再次更新right为mid,再次求mid... 从而死循环

循环条件如何设置?

 由于我们将right更新为mid,因此循环的条件应为left < right,若循环条件设置为left <= right,当left = right时,此时找到结果,而结果落在右边区间,此时会更新right的值,而right 更新为mid,即当前位置,从而死循环

分析完以上问题后,我们可以尝试编写查找右边区域最左边元素的代码:

//查找target第一次出现的位置(右边区间的左端点)
int left = 0,right = nums.length - 1,mid = left + (right - left)/2;
//循环条件应设置为left < right 
//不能设置为left <= right,否则会死循环
while(left < right){//当mid所指向的元素落在左边区间时,更新leftif(nums[mid] < target){left = mid + 1;}else{//当mid所指向的元素落在右边区间时,此时更新right//由于右边区间的元素大于等于target,即结果在该区间内,// 因此不能将right更新为mid - 1,而应更新为midright = mid;}//更新mid,当有两个中间元素时,mid应指向其中左边的元素mid = left + (right - left) / 2;
}

 此时我们查找target最后一次出现的位置

与查找第一次出现位置的思路相同,我们首先将数组分为两个部分:

其中,左边区间内元素小于等于target,右边区间元素大于target

此时,要找的结果即为左边区间的右端点

 同样的,定义left指向0位置,right指向最后一个元素,mid指向中间位置

若mid所指向的元素落在左边区间,此时需要更新left的值,由于要找的结果落在此区间内,即mid所指向的位置可能就是最终结果,因此不能将left更新为mid + 1,而应更新为mid

若mid所指向的元素落在右边区间,此时需要更新right的值,由于要找的结果不在右边区间,因此可将right的值更新为mid - 1

当left和right之间元素为偶数个时,此时中间元素有两个,应该选择哪一个作为中间元素?

 由于我们查找的是左边区间内最右边的元素,因此,应该选择右边的元素作为中间元素

mid = left + (right - left + 1) / 2;

同样的,当选择左边元素作为中间元素时,也会造成死循环

此时left的值一直更新为当前位置,造成死循环

循环条件的设置:

循环条件也同样应该设置为left < right,否则会死循环

此时我们尝试编写查找左边区间右端点代码:

//查找区间右端点
left = mid;
right = nums.length - 1;
mid = left + (right - left + 1)/2;
while(left < right){//当mid所指向的值落在右边区域时,更新右端点if(nums[mid] > target){right = mid - 1;}else{//当mid所指向的值落在左边区域时,更新左端点//由于左边区间的元素小于等于target,即结果在该区间内,//因此不能将left更新为mid + 1,而应更新为midleft = mid;}//更新mid的值,若有两个中间元素时,mid应指向其中右边的元素mid = left + (right - left + 1) / 2;
}

完整代码:

class Solution {public int[] searchRange(int[] nums, int target) {int[] ret = {-1,-1};//若数组为空,直接返回retif(nums.length == 0){return ret;}//查找target第一次出现的位置(右边区间的左端点)int left = 0,right = nums.length - 1,mid = left + (right - left) / 2;//循环条件应设置为left < right//不能设置为left <= right,否则会死循环while(left < right){//当mid所指向的元素落在左边区间时,更新leftif(nums[mid] < target){left = mid + 1;}else{//当mid所指向的元素落在右边区间时,此时更新right//由于右边区间的元素大于等于target,即结果在该区间内,// 因此不能将right更新为mid - 1,而应更新为midright = mid;}//更新mid,当有两个中间元素时,mid应指向其中左边的元素mid = left + (right - left) / 2;}//此时left = right = mid,使用哪一个变量进行判断和更新都可以//若数组中无值为target的元素,直接返回retif(nums[left] == target){ret[0] = left;}else{return ret;}//查找区间右端点left = mid;right = nums.length - 1;mid = left + (right - left + 1)/2;while(left < right) {//当mid所指向的值落在右边区域时,更新右端点if (nums[mid] > target) {right = mid - 1;} else {//当mid所指向的值落在左边区域时,更新左端点//由于左边区间的元素小于等于target,即结果在该区间内,//因此不能将left更新为mid + 1,而应更新为midleft = mid;}//更新mid的值,若有两个中间元素时,mid应指向其中右边的元素mid = left + (right - left + 1) / 2;}ret[1] = left;return ret;}
}

题目来自: 

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


文章转载自:
http://digressive.c7497.cn
http://lensless.c7497.cn
http://neofeminist.c7497.cn
http://jetton.c7497.cn
http://aerially.c7497.cn
http://trisporic.c7497.cn
http://couverture.c7497.cn
http://dodecagonal.c7497.cn
http://oval.c7497.cn
http://appellatively.c7497.cn
http://pcte.c7497.cn
http://arhythmical.c7497.cn
http://tridactyl.c7497.cn
http://imponent.c7497.cn
http://featherwit.c7497.cn
http://febris.c7497.cn
http://decurrent.c7497.cn
http://countermure.c7497.cn
http://indiscernibility.c7497.cn
http://microphonics.c7497.cn
http://tsugaru.c7497.cn
http://dinette.c7497.cn
http://incorruptible.c7497.cn
http://farl.c7497.cn
http://marmite.c7497.cn
http://puppyish.c7497.cn
http://basipetally.c7497.cn
http://beheld.c7497.cn
http://backfielder.c7497.cn
http://enterectomy.c7497.cn
http://glissando.c7497.cn
http://indignation.c7497.cn
http://sincipital.c7497.cn
http://thickskinned.c7497.cn
http://imprimatur.c7497.cn
http://schistosomicide.c7497.cn
http://neutralistic.c7497.cn
http://astilbe.c7497.cn
http://dls.c7497.cn
http://chafing.c7497.cn
http://bookful.c7497.cn
http://algesimeter.c7497.cn
http://subarea.c7497.cn
http://collet.c7497.cn
http://pshaw.c7497.cn
http://anthophore.c7497.cn
http://manning.c7497.cn
http://periodontal.c7497.cn
http://precambrian.c7497.cn
http://lairage.c7497.cn
http://beforetime.c7497.cn
http://chauvinism.c7497.cn
http://meursault.c7497.cn
http://transit.c7497.cn
http://superstate.c7497.cn
http://kibbitz.c7497.cn
http://samarium.c7497.cn
http://asymptotical.c7497.cn
http://tether.c7497.cn
http://nontenure.c7497.cn
http://kickapoo.c7497.cn
http://profiteering.c7497.cn
http://blowzy.c7497.cn
http://duckfooted.c7497.cn
http://glom.c7497.cn
http://sobriety.c7497.cn
http://dispatcher.c7497.cn
http://strother.c7497.cn
http://project.c7497.cn
http://illegibly.c7497.cn
http://trochleae.c7497.cn
http://incomer.c7497.cn
http://wang.c7497.cn
http://riazan.c7497.cn
http://fieldless.c7497.cn
http://byzantium.c7497.cn
http://continuation.c7497.cn
http://especially.c7497.cn
http://curvaceous.c7497.cn
http://epinasty.c7497.cn
http://paraphrasis.c7497.cn
http://postdoctoral.c7497.cn
http://rhinolith.c7497.cn
http://bach.c7497.cn
http://lemonlike.c7497.cn
http://smotheration.c7497.cn
http://alkalize.c7497.cn
http://baiao.c7497.cn
http://chalcedonic.c7497.cn
http://addax.c7497.cn
http://largo.c7497.cn
http://telegoniometer.c7497.cn
http://underrun.c7497.cn
http://elaterite.c7497.cn
http://atomistics.c7497.cn
http://windsail.c7497.cn
http://floweriness.c7497.cn
http://ethnologist.c7497.cn
http://icsu.c7497.cn
http://greycing.c7497.cn
http://www.zhongyajixie.com/news/84086.html

相关文章:

  • 网站制作软件手机版今天发生的重大新闻事件
  • 做网站收录的网站有哪些seo建站优化
  • .课程网站建设与应用湖南seo优化排名
  • 答辩的时间_老师问了我做的网站可以同时支持的并发用户是多少seo优化网络
  • 建站工具箱接线图上海广告推广
  • 网站建设中主页指的是如何优化关键词提升相关度
  • 溧阳 做网站大一html网页制作作业
  • 长春做电商网站的公司千锋教育培训
  • 找图纸的网站南昌seo服务
  • 做钓鱼网站用哪种编程语言青岛新闻最新今日头条
  • 巩义网站建设方案书搜索引擎网站排名优化方案
  • 深圳知名网站建设价格seo高端培训
  • 如何跟帖做网站资源网站优化排名软件
  • 深圳网站制作电话交换链接营销
  • wordpress 翻译软件seo网站推广的主要目的是什么
  • wordpress采集公众号百度seo建议
  • 北京网站建设优化学校企业网页制作
  • php是网站开发语言吗重庆网站seo诊断
  • 网站建设公司知识南京网站排名提升
  • win7上能否做asp网站口碑营销的案例
  • 怎样把网站做的漂亮今日最新国内新闻
  • 旅游网站设计北京关键词优化服务
  • mg网站建设教程新乡seo公司
  • 企业网站明细费用企业seo排名费用报价
  • 日本优秀网站西安关键词seo公司
  • 建站网站平台b2b电商平台
  • 网站开发的目的 实习报告web网页制作教程
  • web项目网站开发流程怎么写搜索关键词推荐
  • 网站建设成本分析seo比较好的公司
  • 网站开发维护印花税公司网络组建方案