二分查找

二分查找

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

样例输入
nums=[-1,0,3,5,9,12], target=9
样例输出
4

样例输入
nums=[-1,0,3,5,9,12], target=2
样例输出
-1

提示:
你可以假设nums中的所有元素是不重复的
n将在[1,10000]之间
nums的每个元素都将在[-9999,9999]之间

思路分析

既然给定数组已经升序的了,那么就可以用二分法查找

但是二分法这个算法存在局限性,即不能索引给定的有序数组的左右边界的值,具体分析请看这篇文章https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/

代码实现

import java.util.Scanner;

public class BinarySearch {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }
        int target = scanner.nextInt();
        System.out.println(binary_search(nums,target));
    }

    //二分查找
    public static int binary_search(int[] nums,int target){

        int left = 0;
        int right = nums.length - 1;

        while (left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                return mid;
            }
            else if (nums[mid] < target){
                left = mid + 1;
            }
            else if (nums[mid] > target){
                right = mid - 1;
            }
        }
        return -1;
    }
}

运行结果

请添加图片描述
请添加图片描述

posted @ 2021-07-28 00:18  小芦荟同学  阅读(40)  评论(0编辑  收藏  举报