/**
 * 循环有序的数组进行二分查找
 * @param A
 */
public static int find(int[] A, int n, int target){
    if(n<=0)
        return -1;
    int left = 0, right = n-1;
    while(left<=right)
    {
        int mid = left + ((right-left)/2);
        if(A[mid] == target){
            return mid;
        }
        //转折点在中间点的右半边
        if(A[left] <= A[mid])
        {
            if(A[left] <= target && target < A[mid]){
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        else //转折点在中间点左半边
        {
            if(A[mid] < target && target <= A[right]){
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
}

 

 public static int find(int nums[], int n, int tag) {
        if (n <= 0) {
            return -1;
        }
        int left = 0;
        int right = n - 1;
        int mid = left + ((right - left) / 2);
        for (; left <= right; ) {
            if (nums[mid] == tag) {
                return mid;//输出索引
            }
            //右侧
            if (nums[left] <= nums[mid]) {
                if (nums[left] <= tag && tag < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {//左侧
                if (nums[right] >= tag && tag > nums[mid]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }

 

相关文章:

  • 2022-02-09
  • 2021-05-19
  • 2022-02-18
  • 2021-06-30
  • 2022-12-23
  • 2021-11-22
  • 2021-08-12
猜你喜欢
  • 2021-08-09
  • 2022-01-01
  • 2021-08-08
  • 2021-12-05
  • 2021-10-30
相关资源
相似解决方案