二分探索アルゴリズム(改善:データが見つからない場合の範囲間隔座標を決定する)

問題

a [0:n-1]をソートされた配列とします。検索要素xが配列にない場合に、xより小さい最大要素位置iとxより大きい最小要素位置jが返されるように、バイナリ検索アルゴリズムを書き直してください。検索要素が配列内にある場合、iとjは同じであり、両方とも配列内のxの位置です。

コード

通常の二分探索

このシナリオは最も単純で、おそらく誰にとっても最も馴染み深いものです。つまり、数値が存在する場合はその数値を検索し、存在する場合はそのインデックスを返し、そうでない場合は-1を返します。

int binarySearch(int[] nums, int target) {
    
    
    int left = 0; 
    int right = nums.length - 1; // 注意

    while(left <= right) {
    
     // 注意
        int mid = (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;
}

改善後

package com.huang.binarySearch;

import java.util.Scanner;

public class BSearch {
    
    
    static int[] binarySearch(int[] nums, int target) {
    
    
        int[] info = new int[2];
        int left = 0;
        int right = nums.length - 1; // 注意

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

    public static void main(String[] args) {
    
    
        int[] nums = {
    
    1, 3, 5, 7, 9, 11, 13, 15};
        System.out.print("存在数组nums=[");
        for (int num : nums) {
    
    
            System.out.print(num+" ");
        }
        System.out.println("]");
        Scanner scanner = new Scanner(System.in);
        //输入要查找的数
        System.out.println("输入要查找的数");
        int i = scanner.nextInt();
        int[] info = BSearch.binarySearch(nums, i);
        //确定区间
        System.out.print(i+"所在位置区间[");
        for (int n : info) {
    
    
            System.out.print(n+" ");
        }
        System.out.print("]");

    }
}


テストを実行する

存在数组nums=[1 3 5 7 9 11 13 15 ]
输入要查找的数
5
5所在位置区间[2 2 ]
存在数组nums=[1 3 5 7 9 11 13 15 ]
输入要查找的数
4
4所在位置区间[1 2 ]
存在数组nums=[1 3 5 7 9 11 13 15 ]
输入要查找的数
0
0所在位置区间[-1 0 ]

おすすめ

転載: blog.csdn.net/qq_40649503/article/details/111407745