首页IT科技每日一题怎么写(每日一题算法)

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

时间2025-07-07 07:03:55分类IT科技浏览4980
导读:数字在升序数组中出现的次数 描述 给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数...

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

描述

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
文件传输服务解释(uucico命令 – 文件传输服务程序) 魏县最近新鲜事(魏县招聘网最新最全招聘信息)