zoukankan      html  css  js  c++  java
  • 33.Search in sorted Array

        /*
         * 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; }
  • 相关阅读:
    java 变量的初始化顺序
    Asp.net MVC3.0 入门指南 1.简介
    使用EnterpriseLibrary5实现数据的缓存(附完整代码下载)
    js showModalDialog 取得(访问)父窗体的语法
    Asp.net MVC3.0 入门指南 2.控制器Controller
    linq 之入门(一) O/R设计器的使用
    sql2000 示例数据库Northwind的 ER图、字段说明及使用Powerdesigner反向工程方法
    局域网共享文件win7系统
    远程桌面 不能粘贴文本 的解决办法
    解决vs2005控件事件为空白
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5411901.html
Copyright © 2011-2022 走看看