【递归、二分查找】数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。

 

复制代码
 1 /**
 2  * 数字在排序数组中出现的次数
 3  * 
 4  * 思路:有序数组,使用二分查找,找到第一个和最后一个K出现的位置
 5  * 
 6  * @author Administrator
 7  *
 8  */
 9 public class Solution {
10     public int GetNumberOfK(int[] array, int k) {
11 
12         int count = 0;
13 
14         if (null != array && array.length > 0) {
15 
16             int first = GetFirstK(array, k, 0, array.length - 1);
17             int last = GetLastK(array, k, 0, array.length - 1);
18 
19             if ((first > -1) && (last > -1)) {
20                 count = last - first + 1;
21             }
22         }
23 
24         return count;
25     }
26 
27     /**
28      * 递归求解第一个k出现的位置
29      * 
30      * @param array
31      * @param k
32      * @param start
33      * @param end
34      * @return
35      */
36     public int GetFirstK(int[] array, int k, int start, int end) {
37 
38         if (start > end) {
39             return -1;
40         }
41 
42         int mid = (start + end) / 2;
43         int midData = array[mid];
44 
45         if (midData == k) {
46             if ((mid >= 1 && array[mid - 1] != k) || mid == 0) {
47                 return mid;
48             } else {
49                 end = mid - 1;
50             }
51         } else if (midData > k) {
52             end = mid - 1;
53         } else {
54             start = mid + 1;
55         }
56 
57         return GetFirstK(array, k, start, end);
58     }
59 
60     /**
61      * 递归求解最后一个k出现的位置
62      * 
63      * @param array
64      * @param k
65      * @param start
66      * @param end
67      * @return
68      */
69     public int GetLastK(int[] array, int k, int start, int end) {
70 
71         if (start > end) {
72             return -1;
73         }
74 
75         int mid = (start + end) / 2;
76         int midData = array[mid];
77 
78         if (midData == k) {
79             if ((mid + 1 < array.length && array[mid + 1] != k) || mid == array.length - 1) {
80                 return mid;
81             } else {
82                 start = mid + 1;
83             }
84         } else if (midData > k) {
85             end = mid - 1;
86         } else {
87             start = mid + 1;
88         }
89 
90         return GetLastK(array, k, start, end);
91     }
92 }
复制代码

 

posted @   Mr.van_Gogh  阅读(1053)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示