在排序數組中查找元素的第一個和最後一個位置(leetcode)

給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。

你的算法時間複雜度必須是 O(log n) 級別。
如果數組中不存在目標值,返回 [-1, -1]。
來源:力扣(LeetCode)

上代碼:

public static void main(String[] ar) {
    int[] nums = {1};
    int[] result = searchRange1(nums, 1);
}
/**
 * 二分法
 * @param nums
 * @param target
 * @param fristOne 是否第一個命中
 * @return
 */
public static int searchRangeLeft(int[] nums, int target, boolean fristOne) {
    int arrLen = nums.length;
    int left = 0;
    int right = arrLen;
    while (left < right) {
        int middle = (left + right) / 2;
        int middleNum = nums[middle];
        if (target == middleNum) {
            if (fristOne) {
                //命中第一個 退出循環
                right = middle;
            } else {
                //往右邊找 是否還有其他相同的 要最後一個
                left = middle + 1;
            }
        } else if (target > middleNum) {
            left = middle + 1;
        } else {
            right = middle;
        }
    }
    return left;
}

public static int[] searchRange1(int[] nums, int target) {
    int[] result = {-1,-1};
    int left = searchRangeLeft(nums, target, true);
    if (nums.length > left && nums[left] == target) {
        //查找右邊最後一個
        int right = searchRangeLeft(nums, target, false)-1;
        if (nums[left] == target) {
            result = new int[]{left, right};
        } else {
            result = new int[]{left, left};
        }
    }
    return result;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章