剑指Offer面试题:6.旋转数组中的最小数字建议收藏

一题目:旋转数组中的最小数字这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素。这种思路的时间复杂度显然是O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

剑指Offer面试题:6.旋转数组中的最小数字建议收藏此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:旋转数组中的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

  这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素。这种思路的时间复杂度显然是O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求

  我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还注意到最小的元素刚好是这两个子数组的分界线。在排序的数组中我们可以用二分查找法实现O(logn)的查找

二 代码实现

#include "stdio.h"
#include <iostream>
using namespace std;

#include <assert.h>

// 遍历序列,找到最小值
int NormalFindMinVal(int *pStart, int *pEnd)
{
    assert(pStart != NULL && pEnd != NULL);
    int min = *pStart++;
    while(pEnd - pStart >= 0)
    {
        if (min > *pStart)
        {
            min = *pStart;
        }

        pStart++;
    }
    return min;
}

int SearchMinInRotateaArr_1(int *pStart, int *pEnd)
{
    if (pStart == NULL || pEnd == NULL)
    {
        return -1;
    }
    if (pEnd - pStart == 1)
    {
        return *pEnd;
    }

    int *pMid = NULL;
    
    pMid = pStart + (pEnd - pStart) / 2;
    
    if (*pMid >= *pStart && *pMid <= *pEnd)
    {
        return NormalFindMinVal(pStart, pEnd);
    }
    if (*pMid >= *pStart)
    {
        pStart = pMid;
    }
    else if(*pMid <= *pEnd)
    {
        pEnd = pMid;
    }
    
    return SearchMinInRotateaArr_1(pStart, pEnd);
}

// 找到旋转数组中的最小数字
int SearchMinInRotateaArr(int arr[], int nLen)
{
    assert(arr != NULL && nLen > 0);

    int *pStart,*pEnd;
    pStart = arr;
    pEnd = pStart + nLen -1;
    
    return SearchMinInRotateaArr_1(pStart, pEnd);
}

int a[] = {3,4,5,1,2};
int b[] = {1,1,1,0,1,1};
int c[] = {1,2,3,4,5};
void main()
{
    int data = SearchMinInRotateaArr(a,sizeof(a)/sizeof(a[0]));
    cout << data << endl;
    data = SearchMinInRotateaArr(b,sizeof(b)/sizeof(b[0]));
    cout << data << endl;
    data = SearchMinInRotateaArr(c,sizeof(c)/sizeof(c[0]));
    cout << data << endl;
    return;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120169.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 文字有阴影效果

    代码如下:效果如下:何问起:Web前端,CSS3,HTML5特效:http://www.cnblogs.com/roucheng/p/texiao.html

    2021年12月24日
  • Apache OFbiz entity engine源代码解读

    Apache OFbiz entity engine源代码解读

  • python psutil模块查找进程_python模块 – psutil「建议收藏」

    python psutil模块查找进程_python模块 – psutil「建议收藏」一、psutil模块:1.psutil模块简介他是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice…

  • LAMP配置点滴[通俗易懂]

    LAMP配置点滴[通俗易懂]第一次配编译安装LAMP足足弄了两天,各种折腾。参考http://www.lamphowto.com/,其他的可以看源码的README,或官方文档其中让浏览器自动提示语法错误的方法是改php.ini:装好后打开网页:localhost/index.html居然显示:TherequestedURL/index.htmlwasnotfoundon

  • 为matlab GUI添加背景图片

    为matlab GUI添加背景图片为matlabGUI添加背景图片为GUI添加一个背景图片,不仅可以让我们的界面变得漂亮大气上档次,而且软件对与用户的交互更加友好。用C或者C++写过软件界面的人都知道,这件事情可以轻而易举的办到,那么问题来了,怎么为matlab的GUI添加一个背景图片呢?其实这个操作也很简单,但是如果是第一次做这个,可能需要折腾好久。在这里我希望跟大家分享一下这个小技巧,避免大家遇到同样的问题再走弯路。欢迎…

  • java中接口的定义与实现

    java中接口的定义与实现

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号