旋转数组的最小数字(二分法查找)

1.二分法查找。

思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。

时间复杂度:递归O(log2n)   非递归O(log2n)

空间复杂度:递归O(log2n)   非递归O(1)

要求:必须是有序的序列,不重复。

代码实现(java)

/** 二分法查找算法实现(非递归)

* 找到返回目标数字

* 未找到则返回-1

* Created by Darker on 15/7/17.

*/

public class TestA{

public static void  main(String[]args){

inta[]={1,2,3,4,5,6};

System.out.println(findData(a,4));

}

public static int findData(int[]a,intx){

int start=0;

int end=a.length-1;

while(start<=end){

int middle=(start+end)/2;

if(x==a[middle]){

return a[middle];

}else

{

if(x

end=middle-1;

}else{

start=middle+1;

}

}

}

return-1;

}

}

2.接下来我们在继续回到旋转数组中最小值这个问题上面。什么是旋转数组?书上的解释是这样的,将一个数组中的前面若干个元素,搬到数组的末尾,就是旋转数组。直接上代码看个明白。

public class TestA{

public static void main(String[]args){

inta[]={1,0,1,1,1,1};

System.out.println(findMinValue(a));

}/**

* 什么是旋转数组,例如数组{3,4,5,1,2} 旋转后变成{1,2,3,4,5}就是一个旋转。

*

* */

public static int findMinValue(inta[]){

if(a.length!=0){

int start=0;

intend=a.length-1;

int middle=start;

while(a[start]<=a[end]){

if(end-start==1){

middle=end;

break;

}

middle=(start+end)/2;

if(a[start]==a[end]&&a[middle]==a[start])

return minInOrder(a,start,end);

if(a[middle]>=a[start]){

start=middle;

}else if(a[middle]<=a[end]){

end=middle;

}

}

return a[middle];

}else{

return-1;

}

}

/**

* 顺序查找

* */

public static int minInOrder(int a[],int start,int end){

int result=a[start];

for(inti=start+1;i<=end;i++){

if(result<=a[i])

result=a[i];

}

return result;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,573评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 日子還是一天天的過,一小時的,一分一秒的在漫步走著。時間聽説是一個Conceptual (概念性)的存在。原始人只...
    FrankFL阅读 189评论 0 0