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


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

     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 }
  • 相关阅读:
    code3728 联合权值
    Codevs 4600 [NOI2015]程序自动分析
    code1540 银河英雄传说
    code1074 食物链
    堆排序
    哈夫曼树与哈夫曼码
    优先队列用法
    code1154 能量项链
    code1225 八数码Bfs
    javascript5
  • 原文地址:https://www.cnblogs.com/jiangyi-uestc/p/5846200.html
Copyright © 2020-2023  润新知