剑指offer 旋转数组

  1. class Solution {
  2. public:
  3. int minNumberInRotateArray(vector<int> rotateArray) {
  4. //常规的遍历方法时间是O(N)的,需要使用二分法,这样对于不重复的数组,就能实现O(logN)的时间
  5. int l=0,r=rotateArray.size()-1;
  6. if(r<0)return NULL;//空数组
  7. int m=0;
  8. while(l<r){//当左指针小于右指针的时候,继续二分法
  9. //下面分两种情况讨论:①数组仍然具有旋转数组特性,②已经不是旋转数组了,变回递增数组,直接返回l
  10. if(rotateArray[l]>=rotateArray[r]){//等号是为了考虑数组存在重复的情况
  11. m=(l+r)>>1;
  12. if(rotateArray[m]<rotateArray[r])//中间值小于右边,则中间值属于属于右边数组
  13. //那么最小值是在 [l,m]之间
  14. r=m;
  15. else
  16. if(rotateArray[m]>rotateArray[r])//中间值大于右边,中间值属于左边数组
  17. //最小值在(m,r]之间
  18. l=m+1;
  19. else//如果中间值等于右边,无法判断,让l++ 或者让r--
  20. l++;
  21. }
  22. else// 当l 小于r 的时候,l一定是最小值
  23. break;
  24. }
  25. return rotateArray[l];
  26. }
  27. };

来自为知笔记(Wiz)

时间: 2024-12-14 09:44:24

剑指offer 旋转数组的相关文章

剑指offer——旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 建议读者自己思考以后再看答案 废话不多说,看代码: public class MinNumberInRotateArray { public static int minNumberInRotateArray(int [] arr) { int low = 0; int high = a

[剑指offer] 旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入描述 一个非递减序列的一个旋转数组 输出描述 输出旋转数组的最小元素 题目分析 原数组最小的值必然是第一个,旋转后数组是两个非递减数组的拼接,只要找到第二个非递减数组的第一个元素就是最小值. 遍历旋转数组,只要有array[i+1]小于array[i],那么array[i+1]

剑指offer—旋转数组的最小数字

题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组(3,4,5,1,2)位{1,2,3,4,5}的一个旋转,该数组的最小值为1. 基本思想: 二分查找,p1指向a[0],p2指向a[len-1].如果a[mid]>a[p1],则最小值在后半段,p1=mid:如果a[mid]<a[p2],则最小值在前半段,p2=mid. 特殊情况: 注意:在这两个数组中,第一个数字.最后一个数字和中间数字都是1,我们无法

剑指offer旋转数组的最小数字python

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 思路 旋转后的数组先递增,然后突然断层,让后又递增,所以,只要找到数组突然变小的那个数字即可. 代码 # -*- coding:utf-8 -*- class Solution: def minNumberInRot

剑指offer (36) 数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面一个数字,则这两个数字组成一个逆序对 题解分析: 首先应该想到很简单的一种解法,顺序遍历数组,对每个数,逐个比较该数字和其以后的数字,T(n) = O(n^2) (1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量 count += Merge(data, temp, first, mid);//找左半段的逆序对数目 count += Merge(data, temp, mid + 1, e

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3

【剑指offer】数组中的逆序对

# @left part: [start, mid] # @right part: (mid, end] def merge(data, start, mid, end): if mid < start or end < mid: return 0 reverse = 0 ''' @ for start, it play as the start index of left part, and mid @ play as the end index of left part; @ mid +

剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt