zoukankan      html  css  js  c++  java
  • LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

    题目描述

    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
    你的算法时间复杂度必须是 (O(log n)) 级别。
    如果数组中不存在目标值,返回 [-1, -1]

    示例1:

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]
    

    示例2:

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array

    思路解析

    题目要求时间复杂度为(O(log n)),考虑用二分法。
    找左边界和有边界均可以使用二分法找到,只是在 nums[mid] == target 时,不要急于返回 true,而是继续向前和向后遍历得到前后边界。

    代码实现

    class Solution {
    private:
        int searchLeft(vector<int>& nums, int target) {
            int lo = 0;
            int hi = nums.size() - 1;
            while(lo <= hi) {
                if(nums[lo] == target)
                    return lo;
                int mid = (lo + hi) / 2;
                if(nums[mid] == target) {
                    while(nums[mid] == target)
                        mid--;
                    return mid + 1;
                }
                else if(nums[mid] < target) {
                    lo = mid + 1;
                }
                else {
                    hi = mid - 1;
                }
            }
            return -1;
        }
        int searchRight(vector<int>& nums, int target) {
            int lo = 0;
            int hi = nums.size() - 1;
            while(lo <= hi) {
                if(nums[hi] == target)
                    return hi;
                int mid = (lo + hi) / 2;
                if(nums[mid] == target) {
                    while(nums[mid] == target)
                        mid++;
                    return mid - 1;
                }
                else if(nums[mid] < target) {
                    lo = mid + 1;
                }
                else {
                    hi = mid - 1;
                }
            }
            return -1;
        }
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            vector<int> result(2, -1);
            result[0] = searchLeft(nums, target);
            result[1] = searchRight(nums, target);
            return result;
        }
    };
    
  • 相关阅读:
    MySql锁机制
    Mysql存储引擎
    Linux 系统中安装mysql
    常见的系统架构
    Linux环境下搭建go开发环境
    Ajax概述
    正向代理和反向代理
    Mysql 存储过程以及在.net中的应用示例
    Mysql 事务
    Windows服务器实现自动化部署-Jenkins
  • 原文地址:https://www.cnblogs.com/xqmeng/p/13894362.html
Copyright © 2011-2022 走看看