剑指offer--找出旋转数组中的最小元素
来源:互联网 发布:上海离婚率数据 编辑:程序博客网 时间:2024/06/02 03:27
把一个数组最开始的元素搬到数组的末尾,称之为数组的旋转,输入一个递增排序的旋转数组,输出旋转数组的最小元素,例如
{3,4,5,1,2}是{1,2,3,4,5}的一个旋转数组,最晓得元素为1。
#include <stdio.h>#include <assert.h>int Min(const int* arr,int right){int left = 0;assert(arr);if (right == 0)return arr[0];while (left < right){int mid = left+ ((right-left)>>1);if (arr [left] == arr [mid] &&arr [right] == arr [mid])return findmin(arr,left,right);if (arr[left] < arr [mid]){ left = mid;}else if (arr[left] > arr[mid]){right = mid;}else {return arr[right];}}}int findmin(const int* arr, int left, int right){int min = arr[left];assert(arr);while (left < right){left++;if (arr[left] < min)min =arr [left];}return min;}int main(){int arr[5]= {3,4,5,1,2};int right = sizeof (arr)/sizeof(arr[0])-1;int ret = Min(arr,right);printf("%d\n",ret);return 0;}
和二分查找法类似,旋转数组可以分为{3,4,5},{1,2}这俩个递增的数组,如果中间元素大于最左边元素,说明中间元素位于左边的递增数组,最小元素应该在第二递增数组中,所以把中间元素赋值为最左边元素,如果中间元素小于最右边元素,说明中间元素位于右边的递增数组,吧这个元素赋值于最右边元素,最后剩两个元素左边就是最大的,右边就是最小的。
但是这里存在一个问题中间元素和最左边最右边均相等时例如{1,0,1,1,1},{1,1,1,0,1}这种情况下上边方法就没法判断,这两个数组都是{0,1,1,1,1}的旋转数组。
1 0
- 剑指offer--找出旋转数组中的最小元素
- 剑指offer--(6) 旋转数组中的最小元素
- 剑指offer- 旋转数组的最小元素
- 剑指Offer旋转数组中的最小数字
- 【剑指offer】旋转数组中的最小数字
- 剑指Offer:旋转数组中的最小数字
- 剑指offer--旋转数组中的最小数
- 找出旋转数组中最小的元素
- 找出旋转数组的最小的元素
- 旋转数组中的最小元素
- 旋转数组中的最小元素。
- 旋转数组中的最小元素
- 旋转数组中的最小元素
- 旋转数组中的最小元素
- 找出旋转数组中的最小数字
- 剑指offer(旋转数组中的最小的数字)
- 剑指offer-面试题8:旋转数组中的最小数字
- 【剑指offer】面试题8:旋转数组中的最小数字
- Bootstrap学习-排版
- 深入了解Arras.sort()与Collections.sort()的区别
- 谈谈你对面向对象的理解?
- 用C++11的std::async代替线程的创建
- 全自动安装JAVA SE以及自动配置环境变量脚本
- 剑指offer--找出旋转数组中的最小元素
- JS获取按键的代码,Js如何屏蔽用户的按键
- caffe初探之-使用C++ API 对 ImageNet 分类
- js的栈和队列基本算法
- 一个故事告诉你比特币的原理及运作机制
- 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来
- 基于Hadoop的数据仓库Hive基础知识
- 神一样的对手?猪一样的队友?
- 贪婪算法