每日一题算法(每日一题怎么样)

  本篇文章为你整理了每日一题算法(每日一题怎么样)的详细内容,包含有30道每日一题 每日一题怎么样 每日一题app 每日一题大全 每日一题算法,希望能帮助你了解 每日一题算法。

  

给定一个长度为 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);

  以上就是每日一题算法(每日一题怎么样)的详细内容,想要了解更多 每日一题算法的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: