https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
解法:
package leetcode2; /** * 2021/3/11 15:41 * * @Author ayue */ public class Solution34 { public int[] searchRange(int[] nums, int target) { //左右逼近 的方式二分查找法 if (nums.length == 0) { return new int[]{-1, -1}; } int left = findLeft(nums, target); if (left == -1) { return new int[]{-1, -1}; } int right = findRight(nums, target); return new int[]{left, right}; } private int findLeft(int[] nums, int target) { int left = 0; int right = nums.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else { right = mid; } } if (nums[left] == target) { return left; } return -1; } private int findRight(int[] nums, int target) { int left = 0; int right = nums.length - 1; while (left < right) { int mid = left + (right - left + 1) / 2;//中间数向上取整,否则就会出现每次left=mid<right,导致死循环的情况 if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else { left = mid; } } return left; } public static void main(String[] args) { int[] nums = new int[]{5, 7, 7, 8, 8, 10}; int target = 8; Solution34 solution34 = new Solution34(); int[] res = solution34.searchRange(nums, target); for (int i : res) { System.out.println(i); } } }