二分查找--34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

示例 1:

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

代码实现


class Solution {
public:
    int left_index(vector<int>& nums,int target)
    {
        int begin = 0;
        int end = nums.size() - 1;
        while(begin <= end)
        {
           int mid = (begin + end) / 2;
            if(nums[mid] == target)
            {
                if(mid == 0 || nums[mid - 1] < target)
                {
                    return mid;
                }
                end = mid - 1;
            }
            else if(target < nums[mid])
            {
                end = mid - 1;
            }
            else if(target > nums[mid])
            {
                begin = mid + 1;
            }
        }
        return -1;
        }
        int right_index(vector<int>& nums,int target)
        {
            int begin = 0;
            int end = nums.size() - 1;
            while(begin <= end)
            {
              int mid = (begin + end) / 2;
                if(nums[mid] == target)
                {
                    if(mid == nums.size() - 1 || nums[mid + 1] > target)
                    {
                        return mid;
                    }
                    begin = mid + 1;
                }
                else if(target < nums[mid])
                {
                    end = mid - 1;
                }
                else if(target > nums[mid])
                {
                    begin = mid + 1;
                }
            }
            return -1;
        }
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> result;
        result.push_back(left_index(nums,target));
        result.push_back(right_index(nums,target));
        return result;
    }
};

原文地址:https://blog.51cto.com/14472348/2473619

时间: 2024-08-09 18:43:59

二分查找--34. 在排序数组中查找元素的第一个和最后一个位置的相关文章

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

34. 在排序数组中查找元素的第一个和最后一个位置 题目要求用O(logn),明显要用二分. 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = nums.length; int mid = (i + j) / 2; int p = -1; while (i < j) { if (nums[mid] == target) { p = mid; bre

【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] 本题同[剑指Offer]面试题53 - I. 在排序数组

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] 题目解析: 方法 1:线性扫描 对 target 检查每

34. 在排序数组中查找元素的第一个和最后一个位置

题目描述查看:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/ 题目的意思是从一个有序的数组中,查找一个数,但是这个数是重复存在的,返回区间.题目要求的时间复杂度O(logn),提醒我们用到二分查找. 思路 先用二分查找找到这个数,在创建新指针找数的左右边界. 当找到这个数的时候,设定l,r指针先指向这个数,然后左右扩展找边界. 1 if(nums[mid] == t

在排序数组中查找元素

/* 34.在排序数组中查找元素的第一个和最后一个位置. 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<mat

【剑指Offer】面试题53 - I. 在排序数组中查找数字 I

题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制:0 <= 数组长度 <= 50000 本题同[LeetCode]34. 在排序数组中查找元素的第一个和最后一个位置 思路 代码 时间复杂度:O(logn) 空间复杂度:O(1) class Solution { public: int search

面试题--&gt;写一个函数,返回一个数组中所有元素被第一个元素除的结果

1 package com.rui.test; 2 3 import java.util.Random; 4 5 /** 6 * @author poseidon 7 * @version 1.0 8 * @date:2015年10月25日 上午11:12:24 9 * @description: 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果 10 * 陷阱: 11 * 1.循环需要倒着写,为什么? 12 * 想想顺着写循环的结果,第一个元素的值会发生变化门后面再除就会有问

编程之美 - 写一个函数,返回数组中所有元素被第一个元素除的结果

问题: 写一个函数,返回数组中所有元素被第一个元素除的结果,包含第一个元素,也要自己除自己 分析: 主要注意两点:1,判断输入是否合法:2,判断除数是否为0:3,从后往前除(真猥琐) 代码实现: 1 /* div_array.cc 2 * 2014/09/03 create 3 * 写一个函数,返回数组中所有元素被第一个元素除的结果,包含第一个元素,也要自己除自己 4 */ 5 #include <iostream> 6 using namespace std; 7 8 void div_ar

[编程之美]写一个函数,返回一个数组中所有元素被第一个元素除的结果

题目: 写一个函数,返回一个数组中所有元素被第一个元素除的结果: 错误的版本: void DivArray(int *array, int n) { for (int i = 0; i < n; ++i) { array[i] /= array[0]; } } 错误原因:在循环的第一步,第一个元素就变成了1,然后再用它去除以其他元素,就不符合题目要求了 改进: 1:使用其他变量保存第一个元素: void DivArray3(int *array, int n) { assert(array !=