Leetcode算法Java全解答--34. 在排序数组中查找元素的第一个和最后一个位置.md

Posted by lizhao on 07-09,2019

Leetcode算法Java全解答--34. 在排序数组中查找元素的第一个和最后一个位置

[toc]

题目

给定一个按照升序排列的整数数组 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]

想法

无限中分,找到目标值的位置(targetIndex)

根据targetIndex往左右2遍扩散

左边就是最小值,右边就是最大值

结果

超过75%的测试案例

时间复杂度/空间复杂度: log n/ 1

总结

代码

我的答案

   public int[] searchRange(int[] nums, int target) {
        if(nums.length==0){
            return new int[]{-1,-1};
        }
        
        int left = 0;
        int right = nums.length;
        int mid = (left+right)/2;
        int targetIndex = -1;
        
        while(left<right){
            if(nums[mid]>target){
                if(right == mid) break;
                right = mid;
                mid = (left + right) /2 ;
            }else if(nums[mid]<target){
                if(left == mid) break;
                left = mid;
                mid = (left + right) /2 ;
            }else{
                targetIndex = mid;
                break;
            }     
        }
        if (targetIndex == -1) {
            return new int[]{-1, -1};
        } else {
            int a = targetIndex, b = targetIndex;
            while (a > 0 && nums[a - 1] == target) a--;
            while (b < nums.length - 1 && nums[b + 1] == target) b++;
            return new int[]{a, b};
        }        
    }

大佬们的答案

 public int[] searchRange(int[] nums, int target) {
		int[] result = new int[] { -1, -1 };
		if (null == nums || nums.length == 0) {
			return result;
		}
		int pos = findPos(nums, target, 0, nums.length);
		if (pos == -1) {
			return result;
		}
		result[0] = testPosL(nums, target, 0, pos);
		result[1] = testPosR(nums, target, pos, nums.length - 1);
		return result;
	}

	public int findPos(int[] nums, int target, int start, int end) {
		int pos = start + (end - start) / 2;
		if (null == nums || nums.length == 0 || start >= end) {
			return -1;
		}
		int m = nums[pos];
		if (m == target) {
			return pos;
		}
		if (m > target) {
			return findPos(nums, target, start, pos);
		} else {
			return findPos(nums, target, pos + 1, end);
		}

	}

	private int testPosL(int[] nums, int target, int l, int r) {
		int m;
		while (l < r) {
			m = (l + r) / 2;
			if (nums[m] < target) {
				l = m + 1;
			} else {
				r = m;
			}
		}
		if (l < 0 || l > nums.length - 1 || nums[l] != target)
			return -1;
		return l;
	}

	private int testPosR(int[] nums, int target, int l, int r) {
		int m;
		while (l <= r) {
			m = (l + r) / 2;
			if (nums[m] > target) {
				r = m - 1;
			} else {
				l = m + 1;
			}
		}
		if (r < 0 || r > nums.length - 1 || nums[r] != target)
			return -1;
		return r;
	}

测试用例


其他

代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan

“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改

如有疑问请联系,联系方式:QQ3060507060