题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。
输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。
输出:
对应每个测试案例,
输出旋转数组中最小的元素。
样例输入:
53 4 5 1 2
样例输出:
1
采用二分查找的策略,重点要考虑一些边界情况:旋转了0元素,即输入的是一个升序排列的数组、只包含一个数字的数组、有很多重复数字的数组等。
#include<stdio.h>
#include<stdlib.h>
int MinInOrder(int*,int,int);
int min(int *numbers,int length)
{
if(numbers==NULL||length<=0)
return 0;
int index1=0;
int index2=length-1;
int indexMid=index1;
while(numbers[index1]>=numbers[index2])
{
if(index2-index1==1)
{
indexMid=index2;
break;
}
indexMid=(index1+index2)/2;
//如果下标为index1,index2和indexMid 指向的三个数字相等
//则只能顺序查找
if(numbers[index1]==numbers[index2]&&numbers[index1]==numbers[indexMid])
return MinInOrder(numbers,index1,index2);
if(numbers[indexMid]>=numbers[index1])
index1=indexMid;
if(numbers[indexMid]<=numbers[index2])
index2=indexMid;
}
return numbers[indexMid];
}
int MinInOrder(int* numbers,int index1,int index2)
{
int result=numbers[index1];
for(int i=index1+1;i<=index2;++i)
{
if(result>numbers[i])
result=numbers[i];
}
return result;
}
int main()
{
int number;
while(scanf("%d",&number)!=EOF)
{
int *numbers=(int*)malloc(number*sizeof(int));
int i;
for(i=0;i<number;i++)
scanf("%d",numbers+i);
int result=min(numbers,number);
printf("%d\n",result);
}
return 0;
}
结果:
分享到:
相关推荐
哈工大算法实验二,最长公共子序列问题,动态规划解决LCS 1.实现基于优化子结构的递归求解算法 2.实现基于动态规划的求解算法 3.实现三个字符串最长公共子序列的动态规划算法 4.有界面源代码和实验报告!...
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出数组的最小元素。...例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 又例如{1,0,1,1,1}和{1,1,1,0,1}都可以看成是递增排序数组{0,1,1,1,1}的...
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路参考博客
2. **最小元素的特性**:在经过旋转的递增数组中,最小元素可能位于两个相邻元素不满足递增关系的位置,即 `arr[i] > arr[i+1]`,此时 `arr[i+1]` 就是旋转数组中的最小值。另外,如果整个数组没有发生旋转(即本身...
3. **返回结果**:当 `left` 和 `right` 相等时,`left` 位置的元素就是旋转数组中的最小值。 这个解题策略巧妙地利用了二分查找的思想,即使在旋转数组的情况下也能保持较高的效率。需要注意的是,由于数组元素...
面试题:旋转数组的最小数字 题目:把一个数组的最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增数组的旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组...
寻找旋转排序数组中的最小值.md
寻找旋转排序数组中的最小值 II.md
通过这个解题思路,我们可以有效地在O(log n)的时间复杂度内找到旋转排序数组中的最小值,避免了遍历整个数组。这对于处理大数据集的性能优化至关重要。 总的来说,这个压缩包文件提供的解题方案展示了如何用PHP来...
在实际编程应用中,这种旋转数组的方法可以用来解决一些算法问题,比如寻找旋转排序数组中的最小值,或者在旋转数组中查找特定元素。通过理解这个旋转过程,我们可以更有效地处理这些问题。 总的来说,旋转数组是一...
c语言 C语言_leetcode题解之第153题寻找旋转排序数组中的最小值
在JavaScript编程领域,旋转数组的最小数字问题是一个经典的算法题目,它主要涉及到数组操作和查找算法。本项目“js代码-200613-旋转数组的最小数字”是针对这个问题的一个解决方案,通过JavaScript语言实现。下面...
寻找旋转排序数组中的最小值 提示 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,...
c语言 C语言_leetcode题解之第154题寻找旋转排序数组中的最小值II
例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的旋转数组,该数组的最小值为1。 思路解析: O(N)的算法 这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第154题,名为“寻找旋转排序数组中的最小值II”。这道题目是数据结构和算法领域的一个经典问题,通常出现在程序员求职面试中,用于...
153. 寻找旋转排序数组中的最小值1.二分法如果 nums[mid] 小于最后一个数,最小值一定在最后一个数左面如果 nums[mid] 在左侧上升序列,最小
任务是找到这个旋转数组中的最小元素。题目规定数组至少包含两个元素,并且旋转是连续的,也就是说不会出现如`[4,5,0,1,2,6,7]`的情况。 解题思路: 1. **二分查找优化**:常规的二分查找在这种情况下无法直接应用...
查找旋转数组的最小数字 查找旋转数组的最小数字是一个经典的算法问题,在 Java 中可以使用多种方法来解决。下面我们将详细介绍查找旋转数组的最小数字的知识点。 首先,让我们了解什么是旋转数组。旋转数组是指将...