求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3

30 篇文章 0 订阅

求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

解题思路:

首先,想到得思路肯定是把这个数组进行右旋转(要理解旋转的概念,就是比如说:abcdef,要进行右旋2位,那么移动后的结果为efabcd),旋转后的数组第一个元素便为该数组的最小值。首先要找到旋转多少位,这需要求解:数组是按照升序排列的,故进行一次循环,找出a[i]>a[i+1]的位置,最终求解到旋转的位置所在。找到之后就进行旋转。下面贴上个人写的程序,如果有什么错误的地方,请指出.:

#include <stdio.h>
void reverse(int *a,int start,int end)
{
int temp;
while(start<=end)
{
temp=a[start];
a[start]=a[end];
a[end]=temp;
start++;
end--;
}
}
void rigth_rotate(int *a,int k,int len)
{
k=k%len;
reverse(a,0,k-1);
reverse(a,k,len-1);
reverse(a,0,len-1);
}
int cal_pos(int *a,int len)
{
int count=0;
int i;
for(i=0;i<len-1;i++)
{
if(a[i]<a[i+1])
count++;
else
break;
}
count+=1;
return count;
}
void main()
{
int a[]={3,4,5,6,7,8,1,2};
int len=sizeof(a)/sizeof(int);
int pos=cal_pos(a,len);
rigth_rotate(a,pos,len);
printf("%d\n",a[0]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值