在一個有重複元素的數組中查找 key 的最左(右)位置

package leetcode;

import org.testng.annotations.Test;

/**
 * Created by fangjiejie on 2019/9/21.
 */
public class BinarySearch {

    @Test
    public void test() {
        int a[] = {1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
        int key = 4;
        System.out.print(binarySearch(a, key));
    }
    /*
    * 在一個有重複元素的數組中查找 key 的最左位置
    * */
    public int binarySearch(int[] nums, int key) {
        int l = 0, h = nums.length - 1;
        while (l < h) {
            int m = l + (h - l) / 2;
            if (nums[m] > key) {
                h = m - 1;
            } else if (nums[m] < key) {
                l = m + 1;
            } else {
                h = m;
            }
        }
        return l;
    }

    /*
    * 在一個有重複元素的數組中查找 key 的最右位置
    * 之所以引入變量maxIndex是因爲當key=a[mid]時,如果直接將left=mid,進入下一次循環時,mid=(left+right)/2=left(向下取整).將陷入無限循環
    * 所以引入maxIndex變量保存最大值,當key=a[mid]時,將left=mid+1,看後面是否還有與key相等的。值得注意的是,循環條件爲left<=right
    * */
    @Test
    public void bs1() {
        int a[] = {1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
        int key = 4;
        int left = 0;
        int right = a.length - 1;
        int maxIndex = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (key >= a[mid]) {
                maxIndex = Math.max(maxIndex, mid);
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        System.out.print(maxIndex);
    }
}

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