二分查找

二分查找

package com.ysx.common;

/**
 * @author youngbear
 * @email [email protected]
 * @date 2019/12/25 22:00
 * @blog https://blog.csdn.net/next_second
 * @github https://github.com/YoungBear
 * @description
 */
public class BinarySearchUtils {

    /**
     * 二分查找
     * @param nums 整型數組
     * @param target 目標值
     * @return 查找匹配的下標,如果沒有匹配的則返回-1
     */
    public static int binarySearch(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int begin = 0;
        int end = nums.length - 1;
        int result = -1;
        while (begin <= end) {
            // 這種寫法是防止begin+end溢出
            int middle = begin + (end - begin) / 2;
            if (nums[middle] == target) {
                return middle;
            } else if (nums[middle] > target) {
                end = middle - 1;
            } else {
                begin = middle + 1;
            }
        }
        return result;
    }

    /**
     * 二分查找
     *
     * @param nums   整型數組
     * @param target 目標值
     * @return 查找第一個匹配的元素,成功返回下標,失敗返回-1
     */
    public static int binarySearchFirst(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int begin = 0;
        int end = nums.length - 1;
        int result = -1;
        while (begin <= end) {
            // 這種寫法是防止begin+end溢出
            int middle = begin + (end - begin) / 2;
            if (nums[middle] == target) {
                result = middle;
                end = middle - 1;
            } else if (nums[middle] > target) {
                end = middle - 1;
            } else {
                begin = middle + 1;
            }
        }
        return result;
    }

    /**
     * 二分查找
     *
     * @param nums   整型數組
     * @param target 目標值
     * @return 查找最後一個匹配的元素,成功返回下標,失敗返回-1
     */
    public static int binarySearchLast(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int begin = 0;
        int end = nums.length - 1;
        int result = -1;
        while (begin <= end) {
            // 這種寫法是防止begin+end溢出
            int middle = begin + (end - begin) / 2;
            if (nums[middle] == target) {
                result = middle;
                begin = middle + 1;
            } else if (nums[middle] > target) {
                end = middle - 1;
            } else {
                begin = middle + 1;
            }
        }
        return result;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章