(二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
2016-10-25 14:01
417 查看
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
/**
* 从有序递增旋转数组45679123 中找到数字6的位置
* 数组递增 但有旋转
* 二分查找思想
* 时间复杂度小于O(N)
* {7,8,9,10,1,2,3,4,5,6}
*************/
int find_revolve_array(const int arr[], int len, int value)
{
if (NULL == arr || len < 0)
{
throw exception("Invalid input");
return 0;
}
int left = 0;
int right = len - 1;
int mid = -1;
while (left <= right)
{
mid = (left - right) / 2 + right; // 不要用 left / 2 + right / 2 因为(5 + 7)/2 = 6 而 (5/2 + 7/2) = 5
// 9/2 + 9/2 = 8 遇不见最后一个数 可能死循环
if (arr[mid] == value)
{
return mid;
}
else if (value < arr[mid])
{
if (value >= arr[left]) // 在左边
{
right = mid -1;
}
else // 在右边
{
left = mid + 1;
}
}
else
{
if (value <= arr[right])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
}
return -1;
}
void test()
{
int arr[] = {7,8,9,10,1,2,3,4,5,6};
int index = find_revolve_array(arr, 10, 7);
}
int main()
{
test();
return 0;
}
本文出自 “城市猎人” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1772623
#include <iostream>
using namespace std;
/**
* 从有序递增旋转数组45679123 中找到数字6的位置
* 数组递增 但有旋转
* 二分查找思想
* 时间复杂度小于O(N)
* {7,8,9,10,1,2,3,4,5,6}
*************/
int find_revolve_array(const int arr[], int len, int value)
{
if (NULL == arr || len < 0)
{
throw exception("Invalid input");
return 0;
}
int left = 0;
int right = len - 1;
int mid = -1;
while (left <= right)
{
mid = (left - right) / 2 + right; // 不要用 left / 2 + right / 2 因为(5 + 7)/2 = 6 而 (5/2 + 7/2) = 5
// 9/2 + 9/2 = 8 遇不见最后一个数 可能死循环
if (arr[mid] == value)
{
return mid;
}
else if (value < arr[mid])
{
if (value >= arr[left]) // 在左边
{
right = mid -1;
}
else // 在右边
{
left = mid + 1;
}
}
else
{
if (value <= arr[right])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
}
return -1;
}
void test()
{
int arr[] = {7,8,9,10,1,2,3,4,5,6};
int index = find_revolve_array(arr, 10, 7);
}
int main()
{
test();
return 0;
}
本文出自 “城市猎人” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1772623
相关文章推荐
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- 递增有序数组中,查找某一个数字的位置
- 插入元素到有序数组,二分搜索查找插入位置
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)
- 二分搜索——在有序数组中找到目标函数出来的最左端的位置
- 利用二分收索查找该数在该数组所在的位置,前提是要保证改数组是有序的
- OJ日常 | 二分查找——旋转数组的最小数字
- Search in Rotated Sorted Array 在旋转过的有序数组中进行二分查找 重点看解法二 三(重重)
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 循环有序数组/旋转数组的二分查找
- 在一个旋转过的有序数组上实现二分查找
- 二分查找——旋转数组的最小数字
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- 【剑指offer】【旋转数组的最小数字 】二分查找的变体
- 旋转有序数组的二分查找
- 二分查找思想寻找有序数组中查找最小值
- 2014-04-04 循环递增数组查找元素(二分变形思想,百度面试题)
- 在一个旋转过的有序数组上实现二分查找 收藏