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;
        }
    };
    
  • 相关阅读:
    python流行的原因
    shell rename directory
    shell if [ -d filename]
    eclipse文本编码格式修改为UTF-8
    egrep 第几列开始
    Java double 精度
    BigDecimal 两种方式
    使用SecureCRT连接ubuntu
    eclipse快速查找一个变量、方法或者类被引用的地方
    我的互联网金融行业经验总结
  • 原文地址:https://www.cnblogs.com/xqmeng/p/13894362.html
Copyright © 2011-2022 走看看