zoukankan      html  css  js  c++  java
  • [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 题目总结

  • 相关阅读:
    睿象云-智能运维平台
    leetcode-----53. 最大子序和
    leetcode-----50. Pow(x, n)
    leetcode-----49. 字母异位词分组
    leetcode-----48. 旋转图像
    leetcode-----47. 全排列 II
    leetcode-----46. 全排列
    leetcode-----44. 通配符匹配
    SpringMVC @RequestParam和@RequestBody的区别
    SpringMVC 接受页面传递参数
  • 原文地址:https://www.cnblogs.com/cnoodle/p/11791421.html
Copyright © 2011-2022 走看看