안전 Offer37 증명 : 주파수 (자바) 번호를 그 종류의 배열이 나타납니다

참조 chaibubble의 블로그 : https://blog.csdn.net/chaipp0607/article/details/76977687

아이디어의 분석 :

정렬 배열 : 배열 행 좋은 시퀀스를 갖는다. (시작은 무엇을 의미 모르겠어요 ..)

  1. 전체 어레이는 대부분, O (N)의 시간 복잡도가 발생하는 K의 개수 값을 산출 할 수 이송.
  2. 이진 검색 방법을 이용하면 값 K 좌단 및 우단의 좌표 값 L은 K R의 좌표를 찾을 수 k는 R-L + 1의 값의 개수이다.
    배열이 내림차순 또는 오름차순되는 말을하지 않는 제목, 그들은 프로그래밍 기본에 관계없이 문제를 내림차순하지 오름차순입니다 오프라인 실제 소를 결정하기 위해 분석을 추가 할 수 있습니다.

방문 : 이진 검색

주제 설명 :

횟수를 정렬 배열에 나타나는 숫자를 계산합니다.

자바 코드 :

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       //排序数组:排好序的数组
       int sum=0;
       int l=leftk(array,k,0,array.length-1);
       int r=rightk(array,k,0,array.length-1);
       if(l>-1&&r>-1){
        sum= r-l+1;
       }
        return sum;
    }
    public static int leftk(int []arr,int k,int left,int right){
        if(left>right){
            return -1;
        }
        int middle=(right+left)/2;
        if(arr[middle]==k){
            if(middle!=left&&arr[middle-1]!=k||middle==left){
                return middle;
            }
            else right=middle-1;
        }
        else if(arr[0]<=arr[arr.length-1]){
            if(arr[middle]>k){
                right=middle-1;
            }
            else if(arr[middle]<k){
                left=middle+1;
            }
        }
        else if(arr[0]>arr[arr.length-1]){//假设当时排序数组是由大到小的,不写也可以的
            if(arr[middle]>k){
                left=middle-1;
            }
            else if(arr[middle]<k){
                right=middle+1;
            }
        }
        return leftk(arr,k,left,right);
    }
    
    public static int rightk(int []arr,int k,int left,int right){
        if(left>right){
            return -1;
        }
        int middle=(right+left)/2;
        if (arr[middle]==k){
            if(middle!=right&&arr[middle+1]!=k||middle==right){
                return middle;
            }
            else{
                left=middle+1;
            }
        }
        else if(arr[0]<=arr[arr.length-1]){
            if(arr[middle]>k){
                right=middle-1;
            }
            else {
                left=middle+1;
            }
        }
        else if(arr[0]>arr[arr.length-1]){//假设当时排序数组是由大到小的,不写也可以的
            if(arr[middle]>k){
                left=middle+1;
            }
            else{
                right=middle-1;
            }
        }
        return rightk(arr,k,left,right);
    }
}

추천

출처www.cnblogs.com/dongmm031/p/12222932.html