二分法一般用来查找有序数列
二分法的时间复杂度为O(logN)
# 一般情况
首先是一个最简单的例子,大多数二分例子也是大同小异
#include<stdio.h>
int main()
{
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int n = 0;
printf("输入要查找的数字:\n");
scanf("%d", &n);
int l = 0;
int r = 9 - 1;
int mid = (l + r) / 2 ;
while (1)
{
if (arr[mid] > n)
r = mid+1;
else if (arr[mid] < n)
l = mid-1;
else
{
printf("找到了在下标为%d的元素", mid);
break;
}
mid = (r + l) / 2;
if (r == l)
{
printf("没有找到.\n");
break;
}
}
return 0;
}
# 特殊情况(旋转数组的最小值)
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤100001≤n≤10000,数组中任意元素的值: 0≤n≤100000≤val≤10000
要求:空间复杂度:(1)O(1) ,时间复杂度:O(logn)
示例1
输入:
[3,4,5,1,2]
复制返回值:
1
复制
示例2
输入:
[3,100,200,3]
复制返回值:
3
注意:
1.前一个数组的任意数一定比后一个数组的任意数大
int main()
{
int arr[7] = { 8,9,1,2,3,4,5 };
int r = 7 - 1;
int l = 0;
int min = *arr;
int mid = 0;
while (1)
{
mid = (l+r+1) >> 1;
if (arr[r] > arr[mid])
r = mid;
else if (arr[r] < arr[mid])
l = mid;
else if (arr[mid] > arr[l])
r = mid;
else
r--;
if (r == l)
{
min = arr[mid];
break;
}
}
printf("%d", min);
return 0;
}