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 = mid+1

    return get_first_num(nums,k,start,end)

def get_end_num(nums,k,start,end):
    if start>end:
        return -1
    mid = (end + start) // 2
    if nums[mid]==k:
        if mid==len(nums)-1 or (mid<len(nums)-1 and nums[mid+1]!=k):
            return mid
        else:
            start = mid
    elif nums[mid]>k:
        end = mid-1
    else:
        start = mid+1
    return get_end_num(nums,k,start,end)

def get_num_k(nums,k):
    start = get_first_num(nums,k,0,len(nums)-1)
    end = get_end_num(nums,k,0,len(nums)-1)
    print(start,end)
    return end-start+1

  注:一般解决方式为利用字典统计各个数字出现的次数或者用二分法查找到其中一个目标数字,然后前后再前后查找。这两种方式的时间复杂度都为O(n)。

O(lgn)的方法为使用两次二分查找,第一次查找目标数字第一次出现的位置,第二次查找其最后一次出现的位置,最后两者相减即为目标数的个数。

原文地址:https://www.cnblogs.com/kingshine007/p/11502743.html

时间: 2024-08-01 16:51:38

53-1-在排序数组中查找数字的相关文章

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

[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 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明

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

剑指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]&