面试题11——旋转数组的最小值

题目:把一个有序数组的末尾几位移到最开始的位置形成的新的新数组成为旋转数组,找出数组的最小值。
自己思路:
查找的话离不开遍历,二分,哈希,二叉搜索树。这题用遍历可以解决,但是太耗费时间了。旋转数组的特点:前面的有序序列必然大于后面的有序序列(假设数组之前是升序排列),可以根据二分进行查找。
代码:
二分查找的递归实现:

#include<iostream>

using namespace std;

int Binary(int temp[], int bin, int end){
    int mid = (bin+end)/2;
    if((end - bin) ==1){
        return temp[end]>temp[bin]?temp[bin]:temp[end];
    };
    if(temp[mid]>temp[bin]){
        Binary(temp, mid,end);  
    }
    else{
        Binary(temp, bin, mid);
    };    
};
int main(){
    int a[5] = {3,4,5,1,2};
    cout<<Binary(a, 0, 4) <<endl;
    return 0;
};

二分查找的while循环实现:

#include<iostream>

using namespace std;

// int Binary(int temp[], int bin, int end){
//     int mid = (bin+end)/2;
//     if((end - bin) ==1){
//         return temp[end]>temp[bin]?temp[bin]:temp[end];
//     };
//     if(temp[mid]>temp[bin]){
//         Binary(temp, mid,end);  
//     }
//     else{
//         Binary(temp, bin, mid);
//     };
    
// };

int Binary(int temp[], int bin, int end){
    // int mid = (bin+end)/2;
    int mid;
    while(end-bin != 1){
        mid = (bin+end)/2;
        if(temp[mid]>temp[bin]){
            bin = mid;
        }else{
           end  = mid; 
        }
    }
    return temp[end];
}
int main(){
    int a[5] = {3,4,5,1,2};
    cout<<Binary(a, 0, 4) <<endl;
    
    return 0;
};

代码优化,如果出现特殊情况应该怎么考虑
1、数组直接是有序的,旋转移动情况是0。
思路:判断数组的中间值是否大于第一个值并且小于最后一个值。加个if判断就可以了。
2、数组的值存在重复
思路:没办法,只能顺序查找。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值