LeetCode_34.在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public int[] searchRange(int[] nums, int target) {
        int[] res = new int[] {-1,-1};
		searchB(nums,0,nums.length-1,target,res);
        if(res[0]==-1  && res[1]!=-1) {
			res[0] = res[1];
		}
		if(res[1]==-1 && res[0]!=-1) {
			res[1] = res[0];
		}
        return res;
    }
    
    public void searchB(int[] nums, int start,int end,int target,int[] res) {
		if(start>end) {
			return;
		}
		if(start==end) {
			if(nums[start]==target) {
				if(res[0]==-1) {
					res[0] = start;
				}else {
					if(start<res[0]) {
						res[0] = start;
					}else {
						if(start>res[1]) {
							res[1] = start;
						}
					}
				}
				swap(res);
			}
		}
		int mid = (start+end)/2;
		if(nums[mid]==target) {
			if(res[0]==-1) {
				res[0] = mid;
			}else {
				if(mid<res[0]) {
					res[0] = mid;
				}else {
					if(mid>res[1]) {
						res[1] = mid;
					}
				}
			}
			swap(res);
		}
		
		if(nums[mid]>target) {
			searchB(nums,start,mid-1,target,res);
		}else if(nums[mid]==target) {
			searchB(nums,start,mid-1,target,res);
			searchB(nums,mid+1,end,target,res);
		}else {
			searchB(nums,mid+1,end,target,res);
		}
	}
    
    public void swap(int[] res) {
		if(res[0]>res[1]) {
			int temp = res[1];
			res[1] = res[0];
			res[0] = temp;
		}
	}

你可能感兴趣的:(LeetCode题解)