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;

旋转有序数组的二分查找相关推荐

  1. 【C语言函数3.2】写一个函数,实现一个整形有序数组的二分查找代码

    写一个函数,实现一个整形有序数组的二分查找代码 #include <stdio.h>int binary_search(int a[], int k, int s) {int left = ...

  2. LeetCode 33. 搜索旋转排序数组(二分查找)

    1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...

  3. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  4. leetcode167. 两数之和 II - 输入有序数组(二分查找)

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  5. 搜索旋转排序数组(JAVA 二分查找)

    整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...

  6. leetcode 81. 搜索旋转排序数组 II(二分查找)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...

  7. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...

  8. LeetCode81. 搜索旋转排序数组 II(二分查找)

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...

  9. LeetCode 702. 搜索长度未知的有序数组(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个升序整数数组,写一个函数搜索 nums 中数字 target. 如果 target 存在,返回它的下标,否则返回 -1.注意,这个数组的大小是未知 ...

最新文章

  1. 5 种将死的编程语言!
  2. 数据处理之不平衡数据过采样与下采样
  3. 李茶:虎牙直播推荐系统架构详解
  4. zend framework mysql_Zend Framework连接Mysql数据库实例分析
  5. c语言截图代码,截图代码 哪位大神帮我找一下错,截出来的图是这样子的
  6. 分布式系统架构以及 CAP 原理
  7. J2ME的移动支付系统的客户端的实现
  8. 只需45秒,Python 给故宫画一组手绘图!
  9. AspUpload组件的安装及使用方法介绍
  10. 夜神模拟器怎么打开开发者选项
  11. 桌面IE图标删不掉解决方案
  12. Android 使用百度飞桨做OCR的本地识别
  13. ubuntu和windows复制粘贴
  14. 第11届极客大挑战writeup
  15. Uncaught (in promise) Error: Network Error at e.exports (axios.js:8:6410) at d.onerror (axio
  16. c语言谢旻吕俊张军强答案,吕俊|
  17. centos 中使用sqlplus 登陆oracle提示bash.sqlplus命令未找到的解决方法
  18. 学人工智能就业前景怎么样?学AI有前途吗?
  19. GBase 8s HAC集群简介
  20. 西门子828D 840Dsl数控程序PLC西门子数控程序中文注释

热门文章

  1. GAN处理手写图片数据集
  2. 客座招生 | 中科院深圳先进院招收智能机器人方向联培和客座学生
  3. 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举
  4. 语音识别:从GMM-HMM到端到端
  5. HDU1166 敌兵布阵 单点更新 区间查询
  6. 03 | 高可用保证:Nacos 如何有效构建注册中心集群
  7. android10位置信息,Android 11 中的位置信息更新
  8. fastjson safemode_它又又又来了,Fastjson 最新高危漏洞来袭!
  9. 【Jenkins持续集成】docker部署+配置+操作Jenkins
  10. Spring-AOP底层实现