/*
* 33.Search in sorted Array
* 2016-4-19 by Mingyang
* 我自己写的代码,开始没有考虑[3,1]取1得情况,所以现在需要额外的加一个部分来
* 判断只有2个数的时候
*/
public static int search1(int[] nums, int target) {
int len = nums.length;
if (len == 0 || nums == null)
return -1;
return searchHelper(nums, target, 0, len - 1);
}
public static int searchHelper(int[] nums, int target, int start, int end) {
if (start > end)
return -1;
int mid = (start + end) / 2;
//这就是多加的部分
if(mid==start||mid==end){
if(nums[start]==target)
return start;
if(nums[end]==target)
return end;
return -1;
}
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > nums[start]) {
if (target >= nums[start] && target <= nums[mid]) {
return searchHelper(nums, target, start, mid - 1);
} else {
return searchHelper(nums, target, mid + 1, end);
}
} else {
if (target >= nums[mid] && target <= nums[end]) {
return searchHelper(nums, target, mid + 1, end);
} else {
return searchHelper(nums, target, start, mid - 1);
}
}
}
/*
* 下面是网上的代码,一样的复杂度,可能更具有延展性
* 如果target比A[mid]值要小------------------------------
* 如果A[mid]右边有序(A[mid]<A[high]) 那么target肯定不在右边(target比右边的都得小),在左边找
* 如果A[mid]左边有序,那么比较target和A[low],如果target比A[low]还要小,
*证明target不在这一区,去右边找;反之,左边找。
* 如果target比A[mid]值要大-------------------------------
* 如果A[mid]左边有序(A[mid]>A[low])
* 那么target肯定不在左边(target比左边的都得大),在右边找 如果A[mid]右边有序
* 那么比较target和A[high],如果target比A[high]还要大,证明target不在这一区,去左边找;反之,右边找。
*/
public int search(int[] A, int target) {
if (A == null || A.length == 0)
return -1;
int low = 0;
int high = A.length - 1;
while (low <= high) { //这里是小于等于哦!!!!!!!!!!!!!----?
int mid = (low + high) / 2;
if (target < A[mid]) {
if (A[mid] < A[high])// right side is sorted
high = mid - 1;// target must in left side
else
if (target < A[low])
// target<A[mid]&&target<A[low]==>means,target cannot be in [low,mid] since this side is sorted
low = mid + 1;
else
high = mid - 1;
} else if (target > A[mid]) {
if (A[low] < A[mid])// left side is sorted
low = mid + 1;// target must in right side
else
if (target > A[high])
// right side is sorted. If target>A[high] means target is not in this side
high = mid - 1;
else
low = mid + 1;
} else
return mid;
}
return -1;
}

最新文章

  1. Linux:将rhel yum 切换到centos yum
  2. nginx日志分析利器GoAccess
  3. bootstrap 3 with IE8 compatibility
  4. Hadoop 2.2.0学习笔记20131210
  5. SqlServer建表规范
  6. equals()源代码及释义
  7. Microsoft-pubs(图书馆管理系统)-数据库设计
  8. 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)
  9. MongoDB Query
  10. 用VS2005编译生成Lua库文件和解释器
  11. Visual Studio 2012使用水晶报表Crystal Report
  12. 根据wsdl文件用soapUi快速创建webService服务(有图有真相)
  13. ubuntu主机名修改
  14. JS获取DOM元素
  15. scrapy 中 xpath 用string方法提取带有空格符解决方法
  16. VirtualBox网络连接方式
  17. ThinkPHP5模型操作中的自动时间戳总结
  18. MySQL安装教程(mysql5.6_bundle)
  19. 雨林木风ghostwin7纯净版系统下载
  20. C# wkhtmltopdf 将html转pdf

热门文章

  1. 【译】Swift 字符串速查表
  2. grep-sed命令用法:
  3. C++ STL容器之 map
  4. GIMP素描效果
  5. Lavarel的学习社区网站和框架优点
  6. 我的Python分析成长之路10
  7. 剑指Offer(书):二叉树的镜像
  8. 学习笔记6——插件 API,“过滤器”(Filters)和“动作”(Actions)
  9. iOS长按控件
  10. BZOJ 4318 OSU! ——期望DP