面试训练旋转数组的最小元素
2012-09-07 14:42
225 查看
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
思路:最简单的思路当然就是o(n)时间遍历数组,如果数组中出现分界点,即前面大后面小,则为该最小值
代码
看了海涛的思路 二分查找,这里就会产生不少问题,虽然时间复杂度降低,但是程序看起来就很复杂了
主要考虑 1 0 1 1 1情况
二分代码如下
分析如下
step 1 :data[0]=1 data[4]=1 mid=2
step 2: index1 = mid data[2]=1 然后 data[4]=1
step 3 :index1 =2 index2 =4 然后 index1=3 index2=4
step 4 :index1=3 index2=4 则只能算出出现 1
这就出现问题,主要是当mid 和前后两个索引对应值相等的情况下 就有问题。
解决办法 就是再这种情况下, 使用o(n)的方法来处理
思路:最简单的思路当然就是o(n)时间遍历数组,如果数组中出现分界点,即前面大后面小,则为该最小值
代码
#include "stdio.h" int main() { //int data[] = {3, 4, 5, 1, 2}; int data[] = {1, 0, 1, 1, 1}; int len = sizeof(data)/sizeof(data[0]); int i; int mid; int d = data[0]; mid=data[0]; for(i=1;i<len;i++) { if(data[i]>=d) { d = data[i]; } else { mid =data[i]; break; } } printf("%d\n",mid);/*测试 1 已排序未旋转 2 前后相等 3 正常排序*/ return 0; }
看了海涛的思路 二分查找,这里就会产生不少问题,虽然时间复杂度降低,但是程序看起来就很复杂了
主要考虑 1 0 1 1 1情况
二分代码如下
int binasearch(int *data,int len) { int length = len-1; int index1 = 0; int index2 = length; int mid=index1; while(data[index1]>=data[index2]) { if(index2-index1==1) { mid =index2; break; } mid = (index1+index2)/2; if(data[mid]>=data[index1]) { index1=mid; } else if(data[mid]<=data[index2]) { index2=mid; } } return data[mid]; }产生问题 在 1 0 1 1 1情况
分析如下
step 1 :data[0]=1 data[4]=1 mid=2
step 2: index1 = mid data[2]=1 然后 data[4]=1
step 3 :index1 =2 index2 =4 然后 index1=3 index2=4
step 4 :index1=3 index2=4 则只能算出出现 1
这就出现问题,主要是当mid 和前后两个索引对应值相等的情况下 就有问题。
解决办法 就是再这种情况下, 使用o(n)的方法来处理
相关文章推荐
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 微软等数据结构+算法面试100题(40)-- 旋转数组中的最小元素
- 程序员面试之 二分搜索 旋转数组的最小元素
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
- 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素
- 旋转数组的最小元素
- 输出一个为递增排序数组的旋转数组中的最小元素――8
- IMWeb提升营Day1 | 训练题6: 旋转数组的最小数字
- C++ 算法 查找旋转数组中的最小值 允许重复元素
- 旋转数组的最小元素
- 面试题8 求旋转后(3 4 5 1 2)的数组中的最小元素
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 剑指offer--找出旋转数组中的最小元素
- 剑指offer 面试8 旋转数组的最小数组
- 剑指Offer(11)旋转数组的最小元素
- 找出旋转数组中最小的元素
- 旋转数组中的最小元素
- 8+查找一个旋转数组的最小元素