首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数字排序数组中出现次数

题目描述 统计一个数字排序数组中出现次数 思想:两次二分查找法 有序序列,就使用二分查找思路。...一开始思路是先使用二分法找到k,然后从k开始向两边统计k个数,但统计这个时间复杂度达到了O(n),导致整个算法复杂度O(nlogn) 而通过两次二分查找,分别找到第一个k和最后一个k,可以使时间复杂度减少为...O(logn) ps:这里还有个问题是,要在主函数里判断一下,是不是最先函数和最后k函数返回位置相同,在这个情况下有两种情况.第一个是没找到,第二个是arr里只存在一个数且为k 代码 package...com.algorithm.offer; import org.junit.Test; public class GetNumberOfK { //题目描述 //统计一个数字排序数组中出现次数...0:lastKIndex-firstKIndex+1; } public int getFirstKIndex(int[] array, int k){//得到第一个k---右结点向左移动

43820
您找到你想要的搜索结果了吗?
是的
没有找到

算法-数字排序数组中出现次数

题目: 统计一个数字排序数组中出现次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现次数就是3。...3.最后,我们发现在排序数组中,如果我们知道了第一个3和最后一个3出现位置,那么其实也就知道了个数,那么我们能否第一次使用二分查找之后,继续使用二分法,找到两端3?...如果中间数字小于3,那么第一个和最后一个3肯定在右半边; ?...如果中间数字等于3,那么需要判断这个3是不是第一个或最后一个3: 如果中间数字左侧相邻数是3,那么第一个3一定在左半边: ?...个人感觉,二分查找关键在于用一种规则,让每次查找之后范围都可以减半,一次来降低时间复杂度,所以改进二分查找可以很多问题中灵活使用,除了这个,旋转数组最小数字问题中也可以用到,甚至旋转数组最小数字

86850

数字升序数组中出现次数_37

看到升序数组,那一般来说二分法跑不了 那么这里我提供下我三种解法,两种二分法,一种hash存储; 1 .两次二分法分别找到第一次出现数字和最后一次出现数字位置 主要思路,二分法第一次查到...k值时候判断前面或者后面是否有也等于k值,以此决定是否要前移或者后移来找到最左或者最右k值点; 代码: public class Solution { //统计一个数字排序数组中出现次数...0:lastKIndex-firstKIndex+1; } public int getFirstKIndex(int[] array, int k){//得到第一个k---右结点向左移动...left, right); } return -1; } public int getLastKIndex(int[] array, int k){//得到第一个...查找k-0.5和k+0.5来获取这两者之间数字个数就是k个数 因为array中都是整数,所以可以稍微变一下,不是搜索k两个位置,而是搜索k-0.5和k+0.5 这两个数应该插入位置,然后相减即可

32110

ArrayList循环中删除元素,会不会出现问题?

ArrayList 循环中删除元素,会不会出现问题?我开始觉得应该会有什么问题吧,但是不知道问题会在哪里。经历了一番测试和查阅之后,发现这个“小”问题并不简单!...不在循环删除,是没有问题,否则这个方法也没有存在必要了嘛,我们这里讨论循环删除,而对 ArrayList 循环方法也是有多种,这里定义一个类方法 remove(),先来看段代码吧。...删除这种元素时,方法一删除重复但不连续元素时是正常,但在删除重复且连续元素时,会出现删除不完全问题,这种删除方式也是用到了 ArrayList 中 remove() 方法。...3.4、将最后一个位置引用设为 null 3.5、返回 fase 4、返回 true 这里我有个疑问,第一个 remove() 方法中代码和 fastRemove() 方法中代码是完全一样第一个...1,这是 i = 1 时循环操作。

2.8K20

剑指Offer-数字排序数组中出现次数

题目描述 统计一个数字排序数组中出现次数 思路 思路一:暴力,简单粗暴,但是并不可取 思路二:因为题中说是排序数组,因此我们要先想到二分查找,因此我们先用二分查找找出某个k出现位置,然后再分别向前和向后查找总个数...思路三:还是二分查找思想,先找到第一个k和最后一个k位置相减 代码实现 package Array; /** * 数字排序数组中出现次数 * 统计一个数字排序数组中出现次数。...10}; System.out.println(solution33.GetNumberOfK_3(array, 5)); } /** * 二分查找 找到第一个...left = mid + 1; } return GetLastIndex(array, k, left, right); } /** * 找到第一个...1; } return GetFirstIndex(array, k, left, right); } /** * 先用二分查找找出某个k出现位置

66450

剑指Offer 第53题:数字升序数组中出现次数

题目如下: 题目地址(牛客网): 数字升序数组中出现次数_牛客题霸_牛客网 (nowcoder.com) 作为剑指系列算法第一题,牛客网给标签是简单,但通过率比较低...,其实这题真不难,我们可以二分查找基础上进行改动,能够很好解决这个题。...---- 正文 思路分析部分 解题思路:首先二分查找,迅速找到目标数字,然后再把此时移动距离同时赋给左与右,让它们向两边进行展开比对即可,当然计数器也会进行记录。...k) { left = mid;//赋值 right = mid;//赋值 break;//结束循环...,当然这得建立在数组有序情况下,因此我使用了快排,但事实是不用快排也能运行,可以猜出牛客网中例子应该都是有序,总的来说知识点不多,无非就是分支与循环、函数、数组,然后再利用折半+遍历,就能解决这个问题

14140

剑指Offer面试题:32.数字排序数组中出现次数

一、题目:数字排序数组中出现次数 题目:统计一个数字排序数组中出现次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。...由于3可能出现多次,因此我们找到3左右两边可能都有3,于是我们找到3左右两边顺序扫描,分别找出第一个3和最后一个3。...因为要查找数字长度为n数组中有可能出现O(n)次,所以顺序扫描时间复杂度是O(n)。因此这种算法效率和直接从头到尾顺序扫描整个数组统计3出现次数方法是一样。...假设我们是统计数字k排序数组中出现次数。在前面的算法中时间主要消耗如何确定重复出现数字第一个k和最后一个k位置上,有没有可能用二分查找算法直接找到第一个k及最后一个k呢?   ...如果中间数字比k小,那么k只有可能出现在数组后半段,下一轮我们只在数组后半段查找就可以了。如果中间数字和k相等呢?我们先判断这个数字是不是第一个k。

37630

每天一道剑指offer-数字排序数组中出现次数

每天一道剑指offer-数字排序数组中出现次数 https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?...tqId=11190&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目详述 统计一个数字排序数组中出现次数...],找4最左下标。...4,这个下标是可能最左4下标所以要记录保存一下; 观察这个数组,可以知道,最左4下标是2,所以为了找到这个最左下标,需要令right值去等于mid-1;这样就把right这一边慢慢地往左靠...,因为是找最左嘛~,所以肯定是要缩小right值去逼近这个最左4,直到找到这个最左4为止~; 找最右边4思路也是一样哦,就是令left=mid+1去逼近最右边这个4.

30110

剑指 offer代码解析——面试题38数字排序数组中出现次数

对于一个有序数组,所有的数字K一定都集中在一起,因此只要我们找到这一组K头和尾就能知道K出现次数。 此时问题就转化为:一个有序数组中寻找某个数字。...出现次数即可。...* * 对于一个有序数组,所有的数字K一定都集中在一起,因此只要我们找到这一组K头和尾就能知道K出现次数。 * 此时问题就转化为:一个有序数组中寻找某个数字。...int k_start = -1; //K终点下标 int k_end = -1; //当子数组长度大于0时候一直循环,获取k起点坐标 while(end-start...start = 0; end = a.length-1; //当子数组长度大于0时候一直循环,获取k终点坐标 while(end-start >= 0){ //计算中点下标

59750

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券