Given an array of integers nums
sorted in ascending order, find the starting and ending position of a given target
value.
If target
is not found in the array, return [-1, -1]
.
You must write an algorithm with O(log n)
runtime complexity.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8 Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6 Output: [-1,-1]
Example 3:
Input: nums = [], target = 0 Output: [-1,-1]
Constraints:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
is a non-decreasing array.-109 <= target <= 109
在有序数组中查找元素的第一个和最后一个位置。
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题的最优解是二分法。思路是通过二分法分别找到第一个插入的位置和第二个插入的位置。注意找第一个位置和第二个位置的不同,两者都是正常的二分法,但是找第一个位置的时候要先顾到 start pointer,同时要优先动 start 指针;找第二个位置的时候要先顾到 end pointer,也优先动 end 指针。这道题很考察对二分法模板的运用。
时间O(logn)
空间O(1)
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @param {number} target 4 * @return {number[]} 5 */ 6 var searchRange = function(nums, target) { 7 // corner case 8 if (nums === null || nums.length === 0) { 9 return [-1, -1]; 10 } 11 // normal case 12 let start = findFirst(nums, target); 13 if (start === -1) { 14 return [-1, -1]; 15 } 16 let end = findLast(nums, target); 17 return [start, end]; 18 }; 19 20 var findFirst = function(nums, target) { 21 let start = 0; 22 let end = nums.length - 1; 23 while (start + 1 < end) { 24 let mid = Math.floor(start + (end - start) / 2); 25 if (nums[mid] < target) { 26 start = mid; 27 } else { 28 end = mid; 29 } 30 } 31 if (nums[start] === target) return start; 32 if (nums[end] === target) return end; 33 return -1; 34 }; 35 36 var findLast = function(nums, target) { 37 let start = 0; 38 let end = nums.length - 1; 39 while (start + 1 < end) { 40 let mid = Math.floor(start + (end - start) / 2); 41 if (nums[mid] > target) { 42 end = mid; 43 } else { 44 start = mid; 45 } 46 } 47 if (nums[end] === target) return end; 48 if (nums[start] === target) return start; 49 return -1; 50 };
Java实现
1 class Solution { 2 public int[] searchRange(int[] nums, int target) { 3 // corner case 4 if (nums == null || nums.length == 0) { 5 return new int[] { -1, -1 }; 6 } 7 8 // normal case 9 int start = findFirst(nums, target); 10 if (start == -1) { 11 return new int[] { -1, -1 }; 12 } 13 int end = findLast(nums, target); 14 return new int[] { start, end }; 15 } 16 17 private int findFirst(int[] nums, int target) { 18 int start = 0; 19 int end = nums.length - 1; 20 while (start + 1 < end) { 21 int mid = start + (end - start) / 2; 22 if (nums[mid] < target) { 23 start = mid; 24 } else { 25 end = mid; 26 } 27 } 28 if (nums[start] == target) { 29 return start; 30 } 31 if (nums[end] == target) { 32 return end; 33 } 34 return -1; 35 } 36 37 private int findLast(int[] nums, int target) { 38 int start = 0; 39 int end = nums.length - 1; 40 while (start + 1 < end) { 41 int mid = start + (end - start) / 2; 42 if (nums[mid] > target) { 43 end = mid; 44 } else { 45 start = mid; 46 } 47 } 48 if (nums[end] == target) { 49 return end; 50 } 51 if (nums[start] == target) { 52 return start; 53 } 54 return -1; 55 } 56 }
相关题目