旋转数组中的最小值
来源:互联网 发布:10月宏观数据 编辑:程序博客网 时间:2024/06/05 14:23
旋转数组: 把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转
要求: 输入一个递增排序的数组的一个旋转,输出旋转数组的最小值.
思想:
从头到尾遍历数组一次,就能找到数组的最小值.时间复杂度是O(n);
根据旋转数组的特性,分析可以得到两个排序的子数组,前面的额子数组的元素大于后面的子数组的元素.
我们可以使用二分法查找到思路查找这个最小的元素
时间复杂度是O(logn)
代码如下
/* 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转; 把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转, 要求: 输入一个递增排序的数组的一个旋转,输出旋转数组的最小值. */#include<stdio.h>#define arr_length(array) (sizeof(array)) / (sizeof(array[0]));//求旋转数组的最小值int get_revolve_array_min(int *arr, int length){ int min_index = 0, max_index = length - 1, mid = min_index; while(arr[min_index] >= arr[max_index]) { if(max_index - min_index == 1){ mid = max_index; break; } mid = (min_index + max_index) / 2; if(arr[mid] >= arr[min_index]){ min_index = mid; }else if(arr[mid] <= arr[max_index]){ max_index = mid; } } return arr[mid];} int main(void){ int arr[5] = {3,4,5,1,2}; int length = arr_length(arr); int result = get_revolve_array_min(&arr, length); printf("\n数组: arr中最小值是: %d", result); return 0;}
特例: 如果吧排序数组的前面的0个元素搬到最后,即数组本身是有序的,这仍然是数组的一个旋转,此时数组中第一个数字就是最小的数字,可以直接返回, 代码中mid = min_index的原因.
以上代码有个问题. 比如旋转数组为{1,0,1,1,1,1,1}或{1,1,1,1,1,0,1}就是当arr[min_index] = arr[max_index] = arr[mid] 时,用上面的代码不会找出真正的最小值, 出现这种情况无法移动指针来缩小查找的范围,只能采取顺序查找的方式进行遍历
修改之后的代码
/* eg: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转; eg: {1,0,1,1,1} 或 {1,1,1,0,1} 是一个旋转数组 把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转, 要求: 输入一个递增排序的数组的一个旋转,输出旋转数组的最小值. */#include<stdio.h>#define arr_length(array) (sizeof(array)) / (sizeof(array[0]));//求旋转数组的最小值int get_revolve_array_min(int *arr, int length){ int min_index = 0, max_index = length - 1, mid = min_index; while(arr[min_index] >= arr[max_index]) { if(max_index - min_index == 1){ mid = max_index; break; } mid = (min_index + max_index) / 2; if((arr[min_index] == arr[max_index]) && (arr[max_index] == arr[mid])){ return min_number(arr, min_index, max_index); } if(arr[mid] >= arr[min_index]){ min_index = mid; }else if(arr[mid] <= arr[max_index]){ max_index = mid; } } return arr[mid];} //出现 arr[min_index] = arr[max_index] = arr[mid] 时 用顺序查找得到最小值int min_number(int *arr, int min_index, int max_index){ int temp = arr[min_index]; int i = min_index + 1; for(i; i <= max_index; i++){ if(temp > arr[i]){ temp = arr[i]; } } return temp;} int main(void){// int arr[5] = {3,4,5,1,2}; int arr[5] = {1,0,1,1,1}; int length = arr_length(arr); int result = get_revolve_array_min(&arr, length); printf("\n数组: arr中最小值是: %d", result); return 0;}
0 0
- 旋转数组中的最小值
- 旋转数组中的最小值
- 笔记 旋转数组中的最小值
- 寻找旋转数组中的最小值
- 求旋转数组中的最小值
- LintCode-寻找旋转排序数组中的最小值
- 题目:寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值
- LintCode 寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值
- LintCode-寻找旋转排序数组中的最小值
- 剑指offer之旋转数组中的最小值
- 寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值 II
- 查找有序旋转数组中的最小值
- 寻找旋转排序数组中的最小值
- [漏洞分析] BlackCat CMS 1.1.1任意文件下载
- opencv配置
- 四种常见的 POST 提交数据方式
- hdu 3433(dp+二分) A Task Process
- 【Linux 内核网络协议栈源码剖析】sendto 函数剖析
- 旋转数组中的最小值
- 专访友盟CEO叶谦:深挖海量终端用户数据的价值
- 我的架构师梦想日记
- Handler
- Windows下MongoDB的安装及配置
- 读<<卓有成效的程序员>>之感补录一
- how inputstream read data?
- openssl RSA加密
- 支付宝回调对接