首页 > 编程语言 >每日一题算法

每日一题算法

时间:2022-11-10 09:47:04浏览次数:43  
标签:int 每日 二分法 算法 数组 array 排序 left

数字在升序数组中出现的次数

描述

给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数

解析

排序数组的查找问题首先考虑二分法
使用二分法找到左右边界的位置,然后长度一减即可

解题思路:

排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别
算法流程:
1、初始化: 声明 i, j 双指针分别指向 array 数组左右两端
2、循环二分: 设 m = (i + j) / 2 为每次二分的中点( "/" 代表向下取整除法,因此恒有 i≤m1、当 array[m] > array[j] 时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m + 1, j] 闭区间内,因此执行 i = m + 1
2、当 array[m] < array[j] 时: m 一定在 右排序数组 中,即旋转点 x 一定在[i, m]闭区间内,因此执行 j = m
3、当 array[m] = array[j] 时: 无法判断 mm 在哪个排序数组中,即无法判断旋转点 x 在 [i, m] 还是 [m + 1, j] 区间中。解决方案: 执行 j = j - 1 缩小判断范围
3、返回值: 当 i = j 时跳出二分循环,并返回 旋转点的值 array[i] 即可。

代码

package esay.JZ53数字在升序数组中出现的次数;

public class Solution {
    private int bisearch(int[] array, double k) {
        int left = 0;
        int right = array.length - 1;
        while (left <= right) {
            int mid = (right + left) / 2;
            if (array[mid] > k) {
                right = mid - 1;
            } else if (array[mid] < k) {
                left = mid + 1;
            }
        }
        return left;
    }
    public int GetNumberOfK(int[] array, int k) {
        return bisearch(array, k+0.5) - bisearch(array, k - 0.5);
    }


}

标签:int,每日,二分法,算法,数组,array,排序,left
From: https://www.cnblogs.com/loongnuts/p/16876031.html

相关文章

  • 每日一题-双指针
    判断子序列intj=0,i=0; while(i<mandj<n){if(b[i]==a[j]){j++;}i++;}cout<<(j==n?"Yes":"No");description......
  • 每日更新版
    目录10.25-html1、html5有哪些新特性?2、lframe的作用及其优缺点?3、常见浏览器内核是什么?4、image标签title与alt属性的区别是什么?5、对WEB标准以及W3C的理解与认识?6......
  • 每日一题之请描述Vue组件渲染流程
    组件化是Vue,React等这些框架的一个核心思想,通过把页面拆成一个个高内聚、低耦合的组件,可以极大程度提高我们的代码复用度,同时也使得项目更加易于维护。所以,本文就来分......
  • 老生常谈React的diff算法原理-面试版
    第一次发文章notonly(虽然)版式可能有点烂butalso(但是)最后赋有手稿研究finally看完他你有收获diff算法:对于update的组件,他会将当前组件与该组件在上次更新是对应的......
  • Diff算法以及key值不建议使用index问题
    title:Diff算法以及key值为什么不建议使用index个人对diff算法一直都是一知半解,没有系统的去了解去尝试去理解,这里就对diff算法初级理论进行一个掌握,当个人能力水平更近......
  • ed25519加密签名算法及应用
    刷知乎时看到一篇文章,很感兴趣,来学习一下!转载文章:ed25519加密签名算法及应用初次使用Github时都需上传本地的公钥,这时需要提前在本地生成密钥对,使用的是ssh-keygen命令......
  • 面试:排序算法代码实现
    目录冒泡排序插入排序希尔排序选择排序堆排序冒泡排序/*====================冒泡排序=======================*/voidbubble_sort(intnums[],intn){for(int......
  • 实验三:朴素贝叶斯算法实验
    实验三:朴素贝叶斯算法实验20大数据三班博客班级qiao_px学号201613336博客链接【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容......
  • 每日一题-区间分组
    区间分组 sort(a.begin(),a.end()); priority_queue<int,vector<int>,greater<int>>q; for(inti=0;i<n;++i){ if(q.empty()orq.top()>=a[i].fir......
  • 每日一题-区间覆盖
    区间覆盖sort(a.begin(),a.end()); intans=0,las=s; for(inti=0;i<n;++i){ intj=i; intr=-2e9; while(j<nanda[j].first<=......