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; }
  • 相关阅读:
    4.1.7 POD对象
    异常处理
    POJ3167 Cow Patterns [KMP]
    POJ1961 Period [KMP应用]
    POJ2778 DNA Sequence [AC自动机+矩阵]
    HDU2243 考研路茫茫——单词情结 [AC自动机+矩阵]
    POJ2185 Milking Grid [KMP应用]
    POJ2541 Binary Witch [状态压缩]
    ZOJ3430 Detect the Virus [AC自动机]
    POJ2752 Seek the Name, Seek the Fame [KMP]
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5411901.html
Copyright © 2011-2022 走看看