zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数-剑指Offer

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

    题目描述

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

    思路

    1. 处理已排好序的数组,考虑用二分查找的思想
    2. 用二分查找找到这个数出现的第一个位置,再找到出现的最后一个位置,可得这个数出现几次,这样的时间复杂度为O(logn)
    3. 注意考虑数组中没有出现该数的情况

    代码

    public class Solution {
        public int GetNumberOfK(int [] array , int k) {
            int num = 0;
            if (array == null || array.length == 0) {
                return num;
            }
            int firstK = getFirstK(array, k, 0, array.length - 1);
            int lastK = getLastK(array, k, 0, array.length - 1);
            System.out.println("first:" + firstK + " lastK:" + lastK);
            if (firstK > -1 && lastK > -1) {
                return lastK - firstK + 1;
            }
            return num;
    
    
        }
        public int getFirstK(int[] data, int k, int start, int end) {
            if (start > end) {
                return -1;
            }
            int midIndex = (start + end) / 2;
            int midData = data[midIndex];
            if (midData == k) {
                if ((midIndex > 0 && data[midIndex - 1] != k) || midIndex == 0) {
                    return midIndex;
                } else {
                    end = midIndex - 1;
                }
            } else if (midData > k) {
                end = midIndex - 1;
            } else {
                start = midIndex + 1;
            }
            return getFirstK(data, k, start, end);
        }
        public int getLastK(int[] data, int k, int start, int end) {
            if (start > end) {
                return -1;
            }
            int midIndex = (start + end) / 2;
            int midData = data[midIndex];
            if (midData == k) {
                if ((midIndex < data.length - 1 && data[midIndex + 1] != k) || midIndex == data.length - 1) {
                    return midIndex;
                } else {
                    start = midIndex + 1;
                }
            } else if (midData > k) {
                end = midIndex - 1;
            } else {
                start = midIndex + 1;
            }
            return getLastK(data, k, start, end);
        }
    }
  • 相关阅读:
    struts2文件上传(多文件)文件下载
    Struts2拦截器
    MySQL中修改多个数据表的字段拼接问题
    Struts2接受请求参数三种常用方法
    struts2 配置详解
    Struts2入门问题
    Struts2启动问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    Ajax和json一道基本的练习题
    jQuery事件--blur()和focus()
    jQuery事件--mouseover()、mouseout()、mouseenter()和mouseleave()
  • 原文地址:https://www.cnblogs.com/rosending/p/5656425.html
Copyright © 2011-2022 走看看