二分查找 LC_0704

142 阅读1分钟

二分查找

时间复杂度O(logn)

步骤

  • 从数组中间的元素开始,如果中间的元素正好是目标值,搜索结束
  • 如果目标值大于或小于中间的元素,则在大于或小于中间的元素的那一半继续搜索

代码模版

//二分查找伪代码模版
while (left <= right) {
  mid = (left + right) / 2;
  if (array[mid] === target) return result;
  else if (array[mid] < target) left = mid + 1;
  else right = mid - 1;
}

例子: LC_0704

/*
给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。

* */
public class LC_0704 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int target = Integer.valueOf(sc.nextLine());
        String[] str = sc.nextLine().trim().replace("[", "").replace("]", "").split(",");
        int n = str.length;
        int[] nums = new int[n];
        for(int i = 0; i < n; i++){
            nums[i] = Integer.valueOf(str[i]);
        }

        int res = search(nums, target);
        System.out.print(res);

    }


    public static int search(int[] nums, int target){
        int left = 0, right = nums.length-1;
        while (left <= right){
            int mid = left + ((right - left) >> 1);
            if(nums[mid] == target) return mid;
            if(nums[mid] < target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return -1;
    }
}

/*
eg:
9
[-1,0,3,5,9,12]
res:
4

2
[-1,0,3,5,9,12]
res:
-1
* */