9.9递归和动态规划(三)——魔术索引
2015-08-08 17:49
260 查看
/**
* 功能:在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i]=i。
* 给定一个有序整数数组,元素值各不相同,找出一个魔术索引。
*
* 进阶:如果数组元素有重复值,如何处理
*/
两种方法:
方法一:
方法二:
进阶:
* 功能:在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i]=i。
* 给定一个有序整数数组,元素值各不相同,找出一个魔术索引。
*
* 进阶:如果数组元素有重复值,如何处理
*/
两种方法:
方法一:
//穷举法 public static int getMagicIndex(int[] array){ for(int i=0;i<array.length;i++){ if(array[i]==i) return i; } return -1; }
方法二:
//二分查找法 /** * 思路:利用数组有序的特点,运用模式匹配法。 * @param array * @return */ public static int getMagicIndex2(int[] array){ return judge(array,0,array.length-1); } public static int judge(int[] array,int start,int end){ if(end<start||start<0||end>array.length) return -1; int mid=(start+end)/2; if(array[mid]==mid) return mid; else if(array[mid]<mid) return judge(array,mid+1,end); else return judge(array,start,mid-1); }
进阶:
//进阶:如果数组元素有重复值 public static int getMagicIndex3(int[] array){ return judge2(array,0,array.length-1); } public static int judge2(int[] array,int start,int end){ if(end<start||start<0||end>array.length) return -1; int midIndex=(start+end)/2; int midValue=array[midIndex]; if(midIndex==midValue) return midIndex; //搜索左半部分 int leftIndex=Math.min(midIndex-1, midValue); int left=judge2(array,start,leftIndex); if(left>=0) return left; //搜索右半部分 int rightIndex=Math.max(midIndex+1, midValue); int right=judge2(array,rightIndex,end); return right; }
相关文章推荐
- django 快速实现文件上传
- ZOJ 题目3228 Searching the String(AC自动机,子川匹配个数)
- scala实现设计模式之建造者模式
- FileUpload上传图片直接浏览显示(没有上传按钮如何上传)
- webpy.org
- SSH框架总结
- jnative 从指针中获得传出值
- FZU - 2125 - 简单等式
- Teaching Mario to play with himself: AI, machine learning, and Super Mario Bros.
- Java核心API -- 12(对象序列化和反序列化)
- 用C#生成KML路径文件(上篇)
- 数据结构学习笔记(二)---单链表
- HDU-OJ-1029 Ignatius and the Princess IV-出现至少(N+1)/2次的数
- 自动布局 01 注意事项
- 《小强升职记》 读书笔记
- java开发微信公众平台备忘
- 3.1html学习之列表
- 汇编语言实现电子闹钟
- uva 11836(两个四面体最短距离)
- Django分页的基本实现办法