首页 > 其他分享 >剑指offer——数字在排序数组中出现的次数

剑指offer——数字在排序数组中出现的次数

时间:2022-11-01 11:09:18浏览次数:57  
标签:end offer int mid start 数组 return 排序 data


题目描述:
统计给定数字k在排序数组中出现的次数

思路1:最容易想到但是效率不高的一个方法就是遍历整个数组,统计k出现的次数(for循环就能解决,不赘述)
思路2:由于题目给出是排序数组,所以很容易想到二分查找,采用二分查找的思路,找到第一个k的下标和最后一个k的下标,即可统计出总共有多少个k

class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return 0;
int first=GetFirstK(data,k,0,data.size()-1);
int last=GetLastK(data,k,0,data.size()-1);
if(first>-1&&last>-1)
return last-first+1;
else//不合法,返回0
return 0;
}
int GetFirstK(vector<int>& data,int k,int start,int end){
if(start>end)//边界不合法
return -1;
int mid=(start+end)>>1;
if(data[mid]==k){
if((mid>0&&data[mid-1]!=k)||mid==0)//等于k的非数组首元素或者是数组首元素
return mid;
else
end=mid-1;
}else if(data[mid]<k)
start=mid+1;
else
end=mid-1;
return GetFirstK(data,k,start,end);
}
int GetLastK(vector<int>& data,int k,int start,int end){
if(start>end)
return -1;
int mid=(start+end)>>1;
if(data[mid]==k){
if(mid<data.size()-1&&data[mid+1]!=k||mid==data.size()-1)
return mid;
else
start=mid+1;
}else if(data[mid]<k)
start=mid+1;
else
end=mid-1;
return GetLastK(data,k,start,end);
}
};


标签:end,offer,int,mid,start,数组,return,排序,data
From: https://blog.51cto.com/u_15855860/5812291

相关文章

  • 剑指offer——二叉树的深度
    题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路1:按照深度优先遍历,设置一个全局变量ma......
  • 剑指offer——不用加减乘除做加法
    题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:分三步1)不考虑进位,只是对两个数进行按位异或(二进制异或就是对应位相加)2)统计进......
  • 剑指offer——圆圈中最后剩下的数字
    题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋......
  • 剑指offer——求1+2+3+...+n的和
    题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)思路1:使用构造函数,创建n个类对象,利用构造函数进行求和计算clas......
  • 剑指offer——扑克牌中的顺子
    题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如......
  • 1662. 检查两个字符串数组是否相等
    1662.检查两个字符串数组是否相等给你两个字符串数组word1和word2。如果两个数组表示的字符串相同,返回true;否则,返回false。输入:word1=["ab","c"],word2=......
  • 快速排序算法
    packagesorting;publicclassQuick{/*双指针,设置两个参数,left和right,分别从左到右边寻找第一个大于a[0](数组的第一个元素)的值,从右到左寻找第一个小于i的值,并进行交换位置......
  • vue之列表排序-计算属性的应用
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-e......
  • 蓝桥杯-着急的WYF(不同子串个数)-Suffix Array后缀数组
    前置知识:后缀数组参考链接:https://blog.csdn.net/u013371163/article/details/60469533https://www.bilibili.com/video/BV1sb411t79N?from=search&seid=13723955058308......
  • Leetcode第1662题:检查两个字符串数组是否相等(Check if two string arrays are equival
    解题思路输入是两个字符串数组,包含的元素数目不一定相同,每个元素包含的字符数目也不一定相同。使用两个指针p和i分别记录遍历的元素位置和字符位置。指针p1和p2分别表示......