033 - Search in Rotated Sorted Array
2015-11-11 18:52
323 查看
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
一个排好序的数列,把分割成多块,再乱序交叉,再查找一个数
int *findright(int *num, int numsize)
{
int left = 0, right = numsize - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (num[mid] >= *num) left = mid + 1;
else if(num[mid] < *num) right = mid - 1;
}
return num + left - 1;
}
int findmid(int *nums, int *x, int size, int target)
{
int left = 0, right = size - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (x[mid] < target) left = mid + 1;
else if(x[mid] > target) right = mid - 1;
else break;
}
return left > right? -1 : x - nums + mid;
}
int search(int* nums, int numsSize, int target)
{
int *left, *right, *move = nums;
while (1) {
left = move;
right = findright(move, numsSize - (left - nums));
if (*left > target) move = right + 1;
else if (*right < target) move = right + 1;
else {
return findmid(nums, left, right - left + 1, target);
}
if (right - nums == numsSize - 1) return -1;
}
}
(i.e.,
0 1 2 4 5 6 7might become
4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
一个排好序的数列,把分割成多块,再乱序交叉,再查找一个数
int *findright(int *num, int numsize)
{
int left = 0, right = numsize - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (num[mid] >= *num) left = mid + 1;
else if(num[mid] < *num) right = mid - 1;
}
return num + left - 1;
}
int findmid(int *nums, int *x, int size, int target)
{
int left = 0, right = size - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (x[mid] < target) left = mid + 1;
else if(x[mid] > target) right = mid - 1;
else break;
}
return left > right? -1 : x - nums + mid;
}
int search(int* nums, int numsSize, int target)
{
int *left, *right, *move = nums;
while (1) {
left = move;
right = findright(move, numsSize - (left - nums));
if (*left > target) move = right + 1;
else if (*right < target) move = right + 1;
else {
return findmid(nums, left, right - left + 1, target);
}
if (right - nums == numsSize - 1) return -1;
}
}
相关文章推荐
- 基于innobackupex的mysql备份脚本
- 黑马程序员-Java集合框架
- 模仿赶集网主界面,上下滑动隐藏布局
- 0欧姆电阻
- gfirefly 学习之ubuntu 15 python 安装memcached, SecureCRT和Eclipse (3)
- 使用xpath的轴(Axis)进行元素定位
- Linux下高cpu解决方案
- MongoDB高级查询[聚合Group]
- 对文件操作之FileUtils方法大全
- c++中实现将字符串按模式分段
- imapsync 实现两个不同邮件域内邮箱的迁移和备份
- 低效的where1=1
- 109 打包.framework
- Mysql 命令操作用户并且分配数据库权限
- PHP 这个周一到周日是几月几号?
- Just a Hook-HDU1698(线段树求区间)
- Java实现两个有序链表的合并
- get 传递中文乱码 解决
- 分享 Java微信开发SDK
- Hql使用总结