leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might 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.

设置 low=0  high=len-1

bsearch(A,low,high)=bsearch(A,low,mid-1)||bsearch(A,mid+1,high)   (A[mid]!=target)

mid                 (A[mid]==target)

这是传统的思路:

我们经过观察发现,只要 A[high]>=A[low]  数组一定是递增的,则选用二分查找

如果不是,则分割 ,使用递归,一定能分割成数组满足第一种状态,

比如,上边的例子我们查找  5,

mid=3,A[mid]=7;分割成(4,5,6)和(0,1,2)连个尾巴都是大于首部,所以直接会被二分查找。

 1 public class Solution {
 2     public int search(int[] A, int target) {
 3         int len=A.length;
 4         if(len==0) return -1;
 5     return    bsearch(A,target,0,len-1);
 6
 7
 8
 9     }
10
11     public int bsearch(int A[],int target,int low,int high)
12     {
13         if(low>high) return -1;
14         int idx=-1;
15         if(A[low]<=A[high]) //it must be YouXu,so binary search
16
17         {
18             while(low<=high)
19             {
20             int mid=(low+high)>>1;
21             if(A[mid]==target)
22             {
23                 idx=mid;
24                 return idx;
25             }
26             else if(A[mid]>target)
27             {
28                 high=mid-1;
29             }
30             else low=mid+1;
31             }
32
33         }
34         else
35         {
36             int mid=(low+high)>>1;
37             if(A[mid]==target)
38             {
39              idx=mid;
40             return idx;
41
42             }
43             else
44             {
45                 idx=bsearch(A,target,low,mid-1);
46                 if(idx==-1)
47                 {
48                     idx=bsearch(A,target,mid+1,high);
49
50                 }
51
52
53
54
55             }
56
57
58
59
60
61
62         }
63
64         return idx;
65
66
67     }
68     }

leetcode旋转数组查找 二分查找的变形,布布扣,bubuko.com

时间: 2024-10-06 21:47:37

leetcode旋转数组查找 二分查找的变形的相关文章

旋转数组的二分查找

问题描述:已知有序数组a[N], 从中间某个位置k(k未知,k=-1表示整个数组有序)分开,然后将前后两部分互换,得到新的数组,在该新数组的查找元素x.如:a[]={1,2,5,7,9,10,15},从k=4分开,得到新数组a={9,10,15, 1,2,5,7}. 1 #include "stdafx.h" 2 3 int search(int *a, int key, int low, int high) 4 { 5 if (low > high) 6 return -1;

(每日算法)LeetCode --- Search in Rotated Sorted Array(旋转数组的二分检索)

Search in Rotated Sorted Array I && II Leetcode 对有序数组进行二分查找(下面仅以非递减数组为例): int binarySort(int A[], int lo, int hi, int target) { while(lo <= hi) { int mid = lo + (hi - lo)/2; if(A[mid] == target) return mid; if(A[mid] < target) lo = mid + 1;

爪哇国新游记之二十七----数组的二分查找

代码: import java.util.ArrayList; import java.util.List; public class Bit { int max; int min; int[] arr; public Bit(int[] arrInput) { // 找出极值 for (int i = 0; i < arrInput.length; i++) { if (max < arrInput[i]) { max = arrInput[i]; } if (min > arrInp

二分查找 数组的二分查找

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 1083: 数组的二分查找 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1646  Solved: 641[Submit][Status][Web Board] Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output 一个整数(表示x的位置,若

9-2-折半查找/二分查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 折半查找/二分查找 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包      

查找 —— 二分查找[递归+非递归]

二分查找 二分查找是对一组有序序列进行查找.根据要查找的k和序列中间元素比较,动态的移动查找范围.以对折的方式缩小查找范围. 递归方式: def binarySearch(A,left,right,k): if left<= right: mid =(left+right)//2 if A[mid] == k: return mid if A[mid]>k: return binarySearch(A,left,mid-1,k) #此处要返回函数运行结果而不是仅仅调用函数 else: retu

PHP实现文本快速查找 - 二分查找

PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键词ID获取关键词等.虽然以上需求都可以在原始建表时,通过冗余数据来解决.但仍有部分业务存的只是关联表的ID,数据分析时需要频繁的查表. 所读的表存在共同的特点 数据几乎不会变更 数据量适中,从一万到100多万,如果全加载到内存也不太合适. 纠结的地方 在做数据分析时,需要十分频繁的读这些表,每秒有可

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

[c/c++] programming之路(15)、多维数组和二分查找法,小外挂

一.多维数组 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[3][4]; 6 int i,j; 7 for (i = 0; i < 3; i++) 8 { 9 for (j = 0; j < 4; j++) 10 { 11 num[i][j]=4*i+j+1; 12 printf("%-3d",num[i][j]); 13 } 14 printf("\