旋转数组的最小数字 java_旋转数组的最小数字(实现和思路)

下面给大家带来的实例是和旋转数组的最小数字相关的内容,一起来看看题目以及解题思路和代码实现吧!

题目:

将一个数组最开始的若干个元素搬到数组的末尾,我们把它叫做是数组的旋转。

输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例:

数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,这个数组的最小值是1。

NOTE:

给出的所有元素都大于0,假如数组大小为0,那么,就请返回0。

思路1

代码实现:function minNumberInRotateArray(rotateArray) {

var left = 0,

length = rotateArray.length,

right = length - 1,

mid;

if (length == 0) { return 0; }

while (rotateArray[left] >= rotateArray[right]) {

if (rotateArray[left] == rotateArray[right]) {

// 对left去重,使其指向最后一个重复的数字

for (var i = left; i 

if (rotateArray[left] != rotateArray[i]) {

left =i-1;

break;

}

}

// 对right去重,使其指向最前一个重复的数字

for (var i = right; i > left; i--) {

if (rotateArray[right] != rotateArray[i]) {

right = i+1;

break;

}

}

}

if (right - left <= 1) {

mid = right;

break;

}

// 四舍五入取整数,否则得到的就是小数,会报错;

mid = Math.round(left + (right - left) / 2);

if (rotateArray[mid] >= rotateArray[left]) {

left = mid;

} else {

right = mid;

}

}

return rotateArray[mid];

}

思路2

代码实现:import java.util.ArrayList;

public class Solution {

public int minNumberInRotateArray(int [] array) {

if(array == null || array.length==0)

return 0;

int low = 0;

int high = array.length-1;

int mid = low;

while(array[low]>=array[high]){

if(array[low] == array[high]){

for(int i=low;i

if(array[low]!=array[i]){

low = i-1;

break;

}

}

for(int i=high;i>=0;i--){

if(array[high]!=array[i]){

high = i+1;

break;

}

}

}

if(high-low<=1){

mid = high;

break;

}

mid = (low+high)/2;

if(array[mid]>=array[low]){

low = mid;

}else if(array[mid]<=array[high]){

high = mid;

}

}

return array[mid];

}

}

思路3:

非递减数组旋转之后最小值,也就是寻找分界点,分界点前后都是非递减数组,分界点后面的非递减数组比分界点前面的数组都要小,所以对旋转数组按顺序查找,当出现后一个数比前一个小时,这个数就是最小值,假如没有出现后一个数比前一个数小的情况,这说明这个数组所有的数都相等,返回数组第一个数就可以了。

注意考虑数组为空的情况,返回0

代码实现:class Solution {

public:

int minNumberInRotateArray(vector

 rotateArray) {

if (rotateArray.size() == 0)

{

return 0;

}

for (size_t i = 0; i 

{

if (rotateArray[i + 1] 

return rotateArray[i + 1];

}

return rotateArray[0];

}

};

以上的代码实现仅供参考,希望可以帮助到大家,更多的实例,可以继续通过本站的java实例栏目来了解哦!

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值