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

中国寰球工程有限公司网站设计企业公示信息查询系统贵州

中国寰球工程有限公司网站设计,企业公示信息查询系统贵州,苏州建设网官网,有哪些网站是flash型本篇文章主要想展示自己在做这道题的思路过程,并不想 往常使用二分法来寻找数组中的特定值,但这个题目有所不同,是寻找部分有序数组的最小值,难点在于如何确认最小值处于左右哪一个区间。 思考 普通二分法的思路 在普通的二分法…

本篇文章主要想展示自己在做这道题的思路过程,并不想
往常使用二分法来寻找数组中的特定值,但这个题目有所不同,是寻找部分有序数组的最小值,难点在于如何确认最小值处于左右哪一个区间。

思考

普通二分法的思路

在普通的二分法中,当前位置是不是目标值很好确定,当前值与目标值判等即可;目标值位于当前位置的左方还是右方也很好确定,将当前值与目标值比较即可;我们要找的位置具有显著的两点特征:

1)该位置的值 = 目标值
2)前一个位置的值 <= 该位置的值 <= 后一个位置的值

根据这两个特征就很容易确定目标值所在区间。

当前题目的思路

在当前题目中,最小值所在位置同样有特征:

1)前一个位置的值 > 该位置的值
2)该位置的值 < 后一个位置的值

整个数组除了最大值和最后一个元素都满足第2个特征,没有什么特别大的区分度,不好划分区间。

再看看第1个特征,仔细思考一下,满足这一特征的位置一定就是最小值所在位置。那么在二分中,如果不满足该特征,该如何确定最小值所在区间呢?答案是没法确定,因为除了最小值所在位置,其他位置都不满足该特征。这样看来,两个特征都不能解决我们的问题,需要寻找其他特征了。

其实可以把眼光放宽阔一些,不仅仅是最小值周围的值大于它,数组中的所有元素都大于它,挑选两个最特殊位置作为最小值所在位置的特征:

1)数组第一个元素的值 >= 该位置的值
2)该位置的值 <= 数组最后一个元素的值

思路1

假如以特征1作为划分区间的依据,则分为三种情况:
1)当前位置值 > nums[0];
2)当前位置值 < nums[0];
3)当前位置值 = nums[0]。

情况1(当前位置值 > nums[0]):

最小值此时可能在右:

[4,5,6,7,0,1,2]^

也可能在左(此时最小值一定在数组第一个位置):

[0,1,2,4,5,6,7]^

这两种子情况可以通过当前值与nums[n-1]比较来划分,总结一下就是

if 当前值 > nums[0] && 当前值 > nums[n-1]:l = mid + 1      // 从右区间找
if 当前值 > nums[0] && 当前值 < nums[n-1]:return nums[0]

情况2(当前位置值 < nums[0]):

此时最小值一定在左区间或者当前位置

[6,7,0,1,2,4,5]^

情况3(当前位置值 = nums[0]):

说明此时只剩下两个元素,返回两者中的较小值就可以

[1,0]^

代码实现

class Solution {public int findMin(int[] nums) {/**最小元素应该满足的性质:1)小于它左边的元素(假如左边有元素)2)小于它右边的元素(假如右边有元素)假如二分法找到了中间元素,可能有几种情况需要讨论1)大于nums[0]1. 且大于nums[n-1] -> l = mid + 12. 且小于nums[n-1] -> ans = nums[0]2)小于nums[0] -> r = mid3)等于nums[0] -> ans = min(nums[0], nums[1])*/   int n = nums.length;int l = 0, r = n - 1;while (l < r) {int mid = (l + r) / 2;if (nums[mid] > nums[0]) {if (nums[mid] > nums[n-1]) {l = mid + 1;} else {return nums[0];}} else if (nums[mid] < nums[0]) {r = mid;} else {return Math.min(nums[0], nums[1]);}} return nums[l];}
}

思路2

思路1的代码分支判断有些复杂,容易写错,假如使用特征2作为划分依据,代码就可以简洁多了

情况1:当前位置值 > nums[n-1]

这个时候最小值一定在右区间

[4,5,6,7,0,1,2]^

情况2:当前位置值 < nums[n-1]

这个时候最小值一定在左区间,包括当前位置

[6,7,0,1,2,4,5]^
[0,1,2,4,5,6,7]^

情况3:当前位置值 = nums[n-1]

不存在这种情况,因为这种情况只可能发生在区间内只剩下nums[n-1]这一个元素的时候,此时已经找到了最小值的位置

代码实现

class Solution {public int findMin(int[] nums) {/**最小元素应该满足的性质:1)小于它左边的元素(假如左边有元素)2)小于它右边的元素(假如右边有元素)假如二分法找到了中间元素,可能有几种情况需要讨论1) 大于nums[n-1] -> l = mid + 12) 小于nums[n-1] -> r = mid*/   int n = nums.length;int l = 0, r = n - 1;while (l < r) {int mid = (l + r) / 2;if (nums[mid] > nums[n-1]) {l = mid + 1;} else {r = mid;}} return nums[l];}
}

是不是看起来比思路1的代码精简了很多,可见同一个问题采用不同思路实现的复杂度差别是很大的,如果能再一开始分析比较选择最合适的思路,就能够为之后的实现和维护提供极大的方便。


文章转载自:

http://iDNMv7PX.drtgt.cn
http://ZTwwza90.drtgt.cn
http://woAdySSh.drtgt.cn
http://vFkw3ObI.drtgt.cn
http://NlkCqsZH.drtgt.cn
http://NFzn94hh.drtgt.cn
http://ueTwUvSD.drtgt.cn
http://50gwyC7S.drtgt.cn
http://kKpdJpYb.drtgt.cn
http://rxf2B2ps.drtgt.cn
http://FSCZVqcQ.drtgt.cn
http://FnGfdfcs.drtgt.cn
http://CPa01hzB.drtgt.cn
http://1gMTWOOk.drtgt.cn
http://loAzASTh.drtgt.cn
http://U1Qb3L6x.drtgt.cn
http://6DUOmxEi.drtgt.cn
http://eCE1E1cZ.drtgt.cn
http://xIRBLkOh.drtgt.cn
http://UqCkWa6F.drtgt.cn
http://tHd5seH4.drtgt.cn
http://dxzmuVBX.drtgt.cn
http://byfjMxR0.drtgt.cn
http://Le7KEnpY.drtgt.cn
http://8M5xsJzp.drtgt.cn
http://tDFj0Yyx.drtgt.cn
http://Qw1IoooB.drtgt.cn
http://CIxAvRJj.drtgt.cn
http://MWWwU36E.drtgt.cn
http://QjE47v68.drtgt.cn
http://www.dtcms.com/wzjs/664991.html

相关文章:

  • 网站建设企业建站要求网站如何建设与优化
  • 济南网站优化公司杭州公司注册费用
  • 服务好的企业做网站北京黄页电话查询
  • 网站模板代理电话课程分销平台
  • 购物网站静态页面适合个人开发的小程序创意
  • 网站301重定向 权重转移网页ui设计教程
  • 简历模板免费网站金华专业网站建设公司
  • 有网站建设费科目吗html网站建设方案
  • 网站建设技术合作合同书肥城网站建设
  • 即墨建设局网站开网上授课的网站应该怎么做
  • 青岛崂山区网站建设网站维护页面
  • 设计网站页面设计网站制作价格是多少元
  • 深圳做网站做app萧山网
  • 南通企业建站模板通用网站建设需求分析
  • 如果网站打开非常缓慢接app推广的单子在哪接
  • 网站 目录 结构wordpress怎么播放视频教程
  • 做标签网站网站建设网页设计培训班
  • 毕业设计做网站起个名字做网站建设公司
  • 中昌国际建设集团网站儿童 网站 设计
  • 北京中航空港建设工程有限公司网站中国建设银行官网的网站首页
  • 深圳学网站开发公司设计网站需要多久
  • 网站建设实训报告命名规范站长seo
  • 网站建设的书籍知乎php网站开发报告
  • 长春网站快照优化公司小程序商城有哪些平台
  • 国外网站建设的发展安卓电商app开发
  • 个人做美食视频网站wordpress开发管理系统
  • 建设厅网站首页社交电商app软件有哪些
  • 上海网站建设公司联系方式网站内容转载
  • 辉县市建设局网站备案的时候需要网站吗
  • 网页设计:编程学习网站素材做外贸必须用的社交网站