二分法寻找第一个值,最后一个值-在排序数组中查找元素的第一个和最后一个位置(binarySearchFirst34)

二分法及进阶

1.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

注意栈溢出问题:

     如果low和high都等于231-1,则int型的mid=(low+high)/2就容易溢出。

    解决方法:mid=low+(high-low)/2;

class Solution {
        public int search(int[] nums, int target) {
            int low=0,high=nums.length-1,mid=-1;
            while(low<=high)
            {
                mid=low+(high-low)/2;
                if(nums[mid]==target) break;
                if(nums[mid]<target) low=mid+1;
                else high=mid-1;
            }
            if(low>high) return -1;
            return mid;
        }
    }

2. 二分查找第一个值

题目:在排序数组中查找元素的第一个和最后一个位置

给定一个升序排列的整数数组 nums,和一个目标值 target。数组内的值有重复,找出给定目标值在数组中的开始位置

 

思路:找到第一个值后,end=mid, 继续向前寻找。

直到start+1>end

public int binarySearchFirst(int start, int end, int target) {
            int mid;
            while (start + 1 < end) {
                mid = start + (end - start)/2;
                if (Nums[mid] == target) end = mid;
                else if (Nums[mid] < target) start = mid + 1;
                else end = mid - 1;
            }
            if (Nums[start] == target) return start;
            if (Nums[end] == target) return end;
            return -1;
        }

3.二分查找最后一个值

同理,查找到第一个值后,start=mid, 继续向后查找。

public int binarySearchLast(int start, int end, int target) {
            int mid;
            while (start + 1 < end) {
                mid = start + (end - start) / 2;
                if (Nums[mid] == target) start = mid;
                else if (Nums[mid] < target) start = mid + 1;
                else end = mid - 1;
            }
            if (Nums[end] == target) return end;
            if (Nums[start] == target) return start;
            return -1;
        }
posted @ 2021-12-12 17:11  言思宁  阅读(139)  评论(0编辑  收藏  举报