[LeetCode] 34. Find First and Last Position of Element in Sorted Array

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 }

 

相关题目

34. Find First and Last Position of Element in Sorted Array

658. Find K Closest Elements

LeetCode 题目总结

posted @ 2019-11-04 12:18  CNoodle  阅读(492)  评论(0编辑  收藏  举报