LeetCode(34)Search for a Range

题目

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,

Given [5, 7, 7, 8, 8, 10] and target value 8,

return [3, 4].

分析

给定一有序整数序列,与目标元素值,要求输出目标元素值在此序列中出现的范围下标。且复杂度控制在O(logn)内。

明显的,我们应该采取二分搜索的思想,设计求出关键字最早出现位置与最后出现位置,与普通的二叉搜索比较,只需要修改判断条件即可。

AC代码

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ret;
        if (nums.size() == 0)
        {
            ret.push_back(-1);
            ret.push_back(-1);
            return ret;
        }

        //寻找目标元素的下标
        int pos = BinarySearch(nums, target);

        //目标元素不存在
        if (pos == -1)
        {
            ret.push_back(-1);
            ret.push_back(-1);
            return ret;
        }
        else{
            int left = BinarySearchLeft(nums, 0, pos, target);
            int right = BinarySearchRight(nums, pos, nums.size()-1 , target);
            ret.push_back(left);
            ret.push_back(right);
            return ret;
        }//if

    }

    int BinarySearch(vector<int> & nums, int target)
    {
        int left = 0, right = nums.size() - 1;

        while (left <= right)
        {
            int mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
            {
                left = mid + 1;
                continue;
            }
            else{
                right = mid - 1;
                continue;
            }
        }//while

        return -1;
    }

    int BinarySearchLeft(vector<int> & nums, int left, int right, int target)
    {
        while (left < right)
        {
            int mid = (left + right) / 2;
            if (nums[mid] == target && nums[mid-1] < target)
                return mid;
            else if (nums[mid] < target)
            {
                left = mid + 1;
                continue;
            }
            else{
                right = mid - 1;
                continue;
            }
        }//while
        return left;
    }

    int BinarySearchRight(vector<int> & nums, int left, int right, int target)
    {
        while (left < right)
        {
            int mid = (left + right) / 2;
            if (nums[mid] == target && nums[mid + 1] > target)
                return mid;
            else if (nums[mid] <= target)
            {
                left = mid + 1;
                continue;
            }
            else{
                right = mid - 1;
                continue;
            }
        }//while
        return right;
    }
};

GitHub测试程序源码

时间: 2024-10-18 05:04:43

LeetCode(34)Search for a Range的相关文章

【LeetCode OJ 34】Search for a Range

题目链接:https://leetcode.com/problems/search-for-a-range/ 题目:Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm's runtime complexity must be in the order of O(log n). If the target is not foun

LeetCode(33)Search in Rotated Sorted Array

题目 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no dup

LeetCode(35) Search Insert Position

题目 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples. [1,3,5,6], 5 → 2 [1,3,5,6]

Leetcode::Longest Common Prefix &amp;&amp; Search for a Range

一次总结两道题,两道题目都比较基础 Description:Write a function to find the longest common prefix string amongst an array of strings. 分析: 这道题目最重要的知道什么叫prefix前缀, 否则一不小心就做成了最长子序列.前缀就是两个序列的前多少位 都要是一样的,不能跳着对齐,这样就比较简单了,也可以求很多个序列的公共前缀. 1 class Solution { 2 public: 3 string

Leetcode(5)最长回文子串

Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定一个字符串 s,找到 s 中 最长 的回文子串.你可以假设 s 的最大长度为 1000.' 第一种方法:未完成:利用回文子串的特点 一开始我的思路如下:回文子串的特点是首尾字母相同,所以我对每一个字母都找到位于它后面的相同字母,利用切片判断这一段是否为回文子串(str[i:j]==str[i:j][::-1]).时间复杂度很高,主要是因为str.find操作非常耗时. class Solution(object): def lo

Leetcode(1)两数之和

Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 第一种方法:暴力 执行用时:5352 ms: 内存消耗:12.9MB 效果:非常差 class Solution(object): def twoSum(self, nums, target): """ :type nums:

Leetcode(3)无重复字符的最长子串

Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果:太差 class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ Maxsize=0 res='' if len(s)

HTML5移动开发之路(34)——jQuery中的选择器

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(34)--jQuery中的选择器 一.jQuery是什么? jQuery是由美国人John Resig创建,至今吸引了来自世界各地的众多JavaScript高手加入其中. jQuery的创始人和技术领袖,目前在Mozilla担任JavaScript工具开发工程师.著有<Pro JavaScript Techniques>(即<精通JavaScript>)等经典JavaScript书籍. jQu

Java知多少(34)final关键字:阻止继承和多态

在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final 修饰的方法不能被子类重写. final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次. final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用. final 修饰的局部变量可以只声明不赋值,然后再进行