《剑指offer》-旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

考察二分查找。虽然是有序数组进行了旋转的,但实际上依然可以用二分的做法来找。

    int minNumberInRotateArray(vector<int> rotateArray){
        int low = 0;
        int high = rotateArray.size() - 1;
        while (low < high){
            int mid = low + (high - low) / 2;
            if (rotateArray[mid] > rotateArray[high]){
                low = mid + 1;
            }
            else if (rotateArray[mid] == rotateArray[high]){
                high = high - 1;;
            }
            else{
                high = mid;
            }
        }
        return array[low];
    }
时间: 2024-10-31 00:50:06

《剑指offer》-旋转数组的最小数字的相关文章

[剑指Offer]10.旋转数组的最小数字

题目1386:旋转数组的最小数字 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000). 输出:

[剑指Offer]40.数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 我们直到异或的性质: 任何一个数字异或他自己都等于0. 所以说我们如果从头到尾依次异或每一个数字,那么最终的结果刚好只出现一次的数字,因为成对出现的两次的数字全部在异或中抵消了. 这道题中有两个数字只出现一次.这样的话我们得到的结果就是这两个数字的异或结果.因此我们想办法把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字.这样我们就可以对这两个子数组分别异或,就能得到两个只出现一

【34】旋转数组的最小数字

题目:把一个递增数组的前几个元素移动到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的旋转,输出旋转数组的最小元素.例如输入3 4 5 6 7 1 2,则最小元素为1.规定递增元素是没有重复元素的. 分析: 1. 最简单做法是从头到尾遍历数组,就可以求出最小元素.时间复杂度O(n),但是这个是最朴素的方法. 2. 根据旋转数组的性质,旋转数组满足"递增-最小值-递增"的性质.利用这个性质我们可以比较快速的求出最小元素.例如3 4 5 6 7 - 1 - 2,就是满足递增-最小值

《剑指offer》-数组中出现次数超过一半的数字

/* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. */ class Solution { public: /* 最开始的想法:排序后,假如存在元素满足题目条件,那么中间位置的元素就是这样的元素,那么双向增长,判断增长停滞点之间的长度 缺点是复杂度过高 int MoreThanHalfNum_Solution(vector<int>

《剑指offer》-数组中只出现一次的数字

/* 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 如果是只有一个数字出现一次,那么所有数字做异或就得到结果: 现在有两个数字x,y分别出现一次,其他数字出现两次,那么所有数字异或的结果是result = x^y x^y肯定不等于0,那么找其二进制表示中不等于0的一个位,比如从右到左第一个位置好了,那么用这个位置能区分开来这两个数字,以及其他的数字,每两个一样的数字都处于同一边. */ class Solution { public: vo

《剑指offer》-数组乘积,不使用除法

题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1].不能使用除法. 这题不准用除法,那么就转化.首先想到的是用"先取log再e回去"的做法,但是因为坑比较多,比如A[i]等于0的情况,log处理0不好弄. 但是这种思路并非一无是处.当发现log 0做不下去,就容易想到直接元素A[i]左右两侧各个元素的乘积left和right,它俩的乘积left x ri

剑指offer学习笔记1

C++的标准不允许复制构造函数传值参数.A(const A& other){},如果是传值参数,把形参复制到实参会调用复制构造函数,就会形成无休止的递归调用从而导致栈溢出. 赋值运算符函数 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString& str); ~CMyString(); CMyString& operator=(const CMyString& ot

剑指Offer之和为S的两个数字

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出"-1 -1" 样例输入: 6 15 1 2 4 7 11 15 样例输出:

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a