1. 程式人生 > 其它 >【劍指offer中等部分12】數字在升序陣列中出現的次數(java)

【劍指offer中等部分12】數字在升序陣列中出現的次數(java)

技術標籤:有趣的演算法二分法演算法資料結構java

目錄

題目描述

統計一個數字在升序陣列中出現的次數。
在這裡插入圖片描述

分析

兩個方法,第一個暴力破解,也就是我們最容易想到的遍歷整個陣列即可,這樣陣列長度為n的話,時間複雜度即為O(n),另一個是二分法,因為給定的陣列為有序陣列。

一、暴力破解

程式碼如下:

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        //常規解法:時間複雜度為O(n)
       int
count = 0; for(int i = 0 ; i < array.length ; i++){ if(array[i] == k){ count++; } } return count; } }

在這裡插入圖片描述

二、二分法

二分法時間複雜度為O(logn)

2.1 二分法思路1

尋找k出現的上下界
在這裡插入圖片描述
中間過程自己可以試著自己推導一下,影響會更深刻噢。
程式碼如下:

public class Solution {
    public int GetNumberOfK(int
[] array , int k) { // 尋找上界leftBound int left = 0, right = array.length; while(left<right){ int mid = (right + left)/2; if(array[mid]<k) left = mid+1; else right=mid; } int leftBound = left; // 尋找下界rightBound
left = 0; right = array.length; while(left<right){ int mid = (right + left)/2; if(array[mid]<=k) left = mid+1; else right = mid; } int rightBound = left; return rightBound-leftBound; } }

在這裡插入圖片描述

2.2 二分法思路2

找到第一個出現k的下標後,分別往這個數的左右找還有幾個和k相等的數。
程式碼如下:

import java.util.Arrays;
public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int index = Arrays.binarySearch(array,k);
        int count = 1;
        if(index < 0)
            return 0;
        //index下標右邊是否也有與k相等的數,有則count++
        for(int i = index + 1 ; i < array.length;i++){
            if(array[i] == k)
                count ++;
            else
                break;
        }
        //index下標左邊是否也有與k相等的數,有則count++
        for(int j = index - 1;j >= 0 ;j--){
            if(array[j] == k)
                count ++;
            else
                break;
        }
        return count;
    }
}

在這裡插入圖片描述