[LeetCode]面试题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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

两次二分,分别查找第一个等于target的索引,和最后一个等于target的索引。

代码

class Solution {
    public int search(int[] nums, int target) {
        int firstPos = searchFirst(nums, target);
        int lastPos = searchLast(nums, target);
        return firstPos == -1? 0 : lastPos - firstPos + 1;
    }

    private int searchFirst(int[] nums, int target){
        int l = 0;
        int r = nums.length - 1;
        while(l <= r){
            int mid = l + (r - l) / 2;
            if(nums[mid] == target){
                r = mid - 1;
            }else if(nums[mid] > target){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return l != nums.length && nums[l] == target ? l : -1;
    }

    private int searchLast(int[] nums, int target){
        int l = 0;
        int r = nums.length - 1;
        while(l <= r){
            int mid = l + (r - l) / 2;
            if(nums[mid] == target){
                l = mid + 1;
            }else if(nums[mid] > target){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return r != -1 && nums[r] == target ? r : -1;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/12364667.html

时间: 2024-08-30 02:57:50

[LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分)的相关文章

【剑指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

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in

剑指offer:在排序数组中查找数字

题目: 统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4. # -*- coding: utf-8 -*- # @Time : 2019-07-13 15:10 # @Author : Jayce Wong # @ProjectName : job # @FileName : getNumberOfK.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : ht

53-1-在排序数组中查找数字

题目:数字在排序数组中出现的次数.输入为一个排序数组和一个数字. def get_first_num(nums,k,start,end): if start>end: return -1 mid = (end+start)//2 if nums[mid]==k: if mid==0 or (mid>0 and nums[mid-1]!=k): return mid else: end = mid-1 elif nums[mid]>k: end = mid-1 else: start =

剑指offer——56在排序数组中查找数字

题目描述 统计一个数字在排序数组中出现的次数. 题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度 可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似. 1 class Solution01 { 2 public: 3 int GetNumberOfK(vector<int> data, int k) { 4 if (data.size() == 0

【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. 在排序数组中查找元素的第一个和最后一个位置(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

在排序数组中查找元素

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

C++在已排序数组中查找和值确定的第一次出现的两个数(要求时间复杂度为o(n))

#include <iostream> using namespace std; //输入一个已经按升序排序过的数组和一个数字, //在数组中查找两个数,使得它们的和正好是输入的那个数字. //要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. //例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. void Grial(int a[],int x,int y) { int j=x-1; int i=0; while(a[j]&