34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
输入输出
1 2 3 4 5 6 7 8 9 10
| 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2:
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1] 示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
|
基本思路
二分查找 但是下一次取mid的时候范围要仔细思考
41行注意:如果有出现lfet = mid
那么在取mid的时候要上取整
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Solution { public int[] searchRange(int[] nums, int target) { int len = nums.length; if(len == 0) return new int[]{-1, -1};
int first = findFirstPosition(nums, target); if(first == -1) return new int[]{-1, -1};
int last = findLastPosition(nums, target); return new int[]{first, last}; }
public int findFirstPosition(int[] nums, int target){ int left = 0; int right = nums.length - 1; while(left < right){ int mid = (left + right) / 2; if(nums[mid] < target){ left = mid + 1; }else if(nums[mid] == target){ right = mid; }else{ right = mid - 1; } } if(nums[left] == target){ return left; } return -1; }
public int findLastPosition(int[] nums, int target){ int left = 0; int right = nums.length - 1; while(left < right){ int mid = (left + right + 1) / 2; if(nums[mid] < target){ left = mid + 1; }else if(nums[mid] == target){ left = mid; }else{ right = mid - 1; } } return left; } }
|