加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

[PHP] 算法-有序数组旋转后寻找最小值的PHP实现

发布时间:2020-05-25 03:11:10 所属栏目:PHP 来源:互联网
导读:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回

<div class="cnblogs_code">

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,51.<span style="color: #000000">利用二分法寻找数组中的最小元素
2.定义两个 指针left和right,<span style="color: #000000">指向数组的第一个元素和最后一个元素,定义一个中间指针mid
3.如果arr[left]小于arr[mid],<span style="color: #000000">那么把左边指针移动到mid处,mid从新计算
4.如果arr[left]大于arr[mid],<span style="color: #000000">那么把右边指针移动到mid处,mid从新计算,缩小范围

left=0 right=arr.length-1
<span style="color: #0000ff">while arr[left]>=<span style="color: #000000">arr[right]
<span style="color: #0000ff">if right-left==1<span style="color: #000000">
mid=<span style="color: #000000">right
<span style="color: #0000ff">break<span style="color: #000000">

mid</span>=left+(right-left)/2
<span style="color: #0000ff"&gt;if</span> arr[left]<=<span style="color: #000000"&gt;arr[mid]
    left</span>=<span style="color: #000000"&gt;mid
</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;
    right</span>=<span style="color: #000000"&gt;mid

<span style="color: #0000ff">return arr[mid]

<span style="color: #800080">$left=0;<span style="color: #008000">//<span style="color: #008000">左边指针
<span style="color: #800080">$right=<span style="color: #008080">count(<span style="color: #800080">$rotateArray)-1;<span style="color: #008000">//<span style="color: #008000">右边指针
//判断条件,left大于right就一直进行
<span style="color: #0000ff">while(<span style="color: #800080">$rotateArray[<span style="color: #800080">$left]>=<span style="color: #800080">$rotateArray[<span style="color: #800080">$right<span style="color: #000000">]){
<span style="color: #008000">//<span style="color: #008000">left和right已经紧挨着了
<span style="color: #0000ff">if((<span style="color: #800080">$right-<span style="color: #800080">$left)==1<span style="color: #000000">){
<span style="color: #800080">$mid=<span style="color: #800080">$right<span style="color: #000000">;
<span style="color: #0000ff">break<span style="color: #000000">;
}
<span style="color: #008000">//<span style="color: #008000">中间点
<span style="color: #800080">$mid=<span style="color: #008080">ceil(<span style="color: #800080">$left+(<span style="color: #800080">$right-<span style="color: #800080">$left)/2<span style="color: #000000">);
<span style="color: #008000">//<span style="color: #008000">left小于中间点
<span style="color: #0000ff">if(<span style="color: #800080">$rotateArray[<span style="color: #800080">$left]<<span style="color: #800080">$rotateArray[<span style="color: #800080">$mid<span style="color: #000000">]){
<span style="color: #008000">//<span style="color: #008000">left移动到中间点
<span style="color: #800080">$left=<span style="color: #800080">$mid<span style="color: #000000">;
}<span style="color: #0000ff">else<span style="color: #000000">{
<span style="color: #008000">//<span style="color: #008000">right移动到中间点
<span style="color: #800080">$right=<span style="color: #800080">$mid<span style="color: #000000">;
}
}

    </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800080"&gt;$rotateArray</span>[<span style="color: #800080"&gt;$mid</span><span style="color: #000000"&gt;];

}
<span style="color: #800080">$min=minNumberInRotateArray(<span style="color: #800080">$arr<span style="color: #000000">);
<span style="color: #008080">var_dump(<span style="color: #800080">$min);<span style="color: #008000">//<span style="color: #008000">int(1)

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读