LeetCode分治法/二分法高頻題(九)

大噶好,我是方圓
無它,唯手熟爾

33. 搜索旋轉排序數組

在這裏插入圖片描述

class Solution {
    public int search(int[] nums, int target) {
        int left = 0,right = nums.length - 1, mid = 0;

        //二分法開求
        while(left <= right){
            mid = left + (right - left)/2;

            //找到這個要求的索引了
            if(nums[mid] == target){
                return mid;
            }

            //根據nums[mid]的和nums[left]的關係,來判斷mid是在左邊還是在右邊
            if(nums[mid] >= nums[left]){
                //在判斷target是在mid的左邊還是mid的右邊兒
                if(target >= nums[left] && target < nums[mid]){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }else{
                if(target > nums[mid] && target <= nums[right]){
                    left = mid + 1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}

34. 在排序數組中查找元素的第一個和最後一個位置

在這裏插入圖片描述

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0, right = nums.length - 1, mid = 0;

        //開始二分查找
        while(left <= right){
            mid = left + (right - left) / 2;

            if(target > nums[mid]){
                left = mid + 1;
            }else if(target < nums[mid]){
                right = mid - 1;
            }else{
                //找到目標值了!
                left = mid;
                right = mid;

                //向左擴大範圍
                while(left -1 >= 0 && nums[left - 1] == target){
                    left--;
                }
                //向右擴大範圍
                while(right + 1 <= nums.length - 1 && nums[right + 1] == target){
                    right++;
                }
                return new int[]{left,right};
            }
        }
        return new int[]{-1,-1};
    }
}

練練練!

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