旋转有序数组的二分查找
http://hi.baidu.com/nicker2010/item/4d4f71145532a234b83180a7
总结规律,简化模型
题目都不难,重要的是很敏锐的发现问题的规律。
旋转有序数组的二分搜索,如
int arr[N] = {15,16,19,20,25,1,3,4,5,7,10,14};
查找X = 5
主要思想:
每次根据L和R求出M后,M左边[L, M]和右边[M+1, R]这两部分中至少一个是有序的。
arr[M]和X比较
(1). arr[M]==X,返回M
(2). arr[M] < arr[R],说明右侧有序,当 arr[M]<X<arr[R],则L=M+1,否则R=M-1
(3). arr[M] > arr[L],说明左侧有序,当 arr[L]<X<arr[M],则R=M-1,否则L=M+1
简单代码:
int CirculateBSearch(const int* arr,int N,int x)
{
int L=0,R=N-1,M;
while(L <= R)
{
M = (L+R)>>1;
if(arr[M] == x) return M;
if(arr[M] <= arr[R])//arr[M]右侧是有序的
{
if(arr[M]<x && x<=arr[R])//x在有序部分的内部
L = M+1;
else R = M-1;
}
else//arr[M]左侧是有序的
{
if(x<arr[M] && arr[L]<=x)//x在有序部分的内部
R = M-1;
else L = M+1;
}
}
return -1;
}
简单测试:
const int N = 12;
int X = 5;
int arr[N] = {15,16,19,20,25,1,3,4,5,7,10,14};
cout<<"Array : ";
PrintArray(arr,N);
int index = CirculateBSearch(arr,N,X);
if(index < 0) cout<<X<<" is not found in arr.\n";
else cout<<X<<" is found in arr, index = "<<index<<endl;
旋转有序数组的二分查找相关推荐
- 【C语言函数3.2】写一个函数,实现一个整形有序数组的二分查找代码
写一个函数,实现一个整形有序数组的二分查找代码 #include <stdio.h>int binary_search(int a[], int k, int s) {int left = ...
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)
一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...
- leetcode167. 两数之和 II - 输入有序数组(二分查找)
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- 搜索旋转排序数组(JAVA 二分查找)
整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...
- leetcode 81. 搜索旋转排序数组 II(二分查找)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...
- 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...
- LeetCode81. 搜索旋转排序数组 II(二分查找)
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...
- LeetCode 702. 搜索长度未知的有序数组(二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个升序整数数组,写一个函数搜索 nums 中数字 target. 如果 target 存在,返回它的下标,否则返回 -1.注意,这个数组的大小是未知 ...
最新文章
- 5 种将死的编程语言!
- 数据处理之不平衡数据过采样与下采样
- 李茶:虎牙直播推荐系统架构详解
- zend framework mysql_Zend Framework连接Mysql数据库实例分析
- c语言截图代码,截图代码 哪位大神帮我找一下错,截出来的图是这样子的
- 分布式系统架构以及 CAP 原理
- J2ME的移动支付系统的客户端的实现
- 只需45秒,Python 给故宫画一组手绘图!
- AspUpload组件的安装及使用方法介绍
- 夜神模拟器怎么打开开发者选项
- 桌面IE图标删不掉解决方案
- Android 使用百度飞桨做OCR的本地识别
- ubuntu和windows复制粘贴
- 第11届极客大挑战writeup
- Uncaught (in promise) Error: Network Error at e.exports (axios.js:8:6410) at d.onerror (axio
- c语言谢旻吕俊张军强答案,吕俊|
- centos 中使用sqlplus 登陆oracle提示bash.sqlplus命令未找到的解决方法
- 学人工智能就业前景怎么样?学AI有前途吗?
- GBase 8s HAC集群简介
- 西门子828D 840Dsl数控程序PLC西门子数控程序中文注释
热门文章
- GAN处理手写图片数据集
- 客座招生 | 中科院深圳先进院招收智能机器人方向联培和客座学生
- 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举
- 语音识别:从GMM-HMM到端到端
- HDU1166 敌兵布阵 单点更新 区间查询
- 03 | 高可用保证:Nacos 如何有效构建注册中心集群
- android10位置信息,Android 11 中的位置信息更新
- fastjson safemode_它又又又来了,Fastjson 最新高危漏洞来袭!
- 【Jenkins持续集成】docker部署+配置+操作Jenkins
- Spring-AOP底层实现