程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [2]數字在數組中出現的次數

[2]數字在數組中出現的次數

編輯:C++入門知識

題目:統計一個數字k在排序數組中出現的次數。例如輸入排序數組{1,2,3,3,3,3,4,5}和數字3,輸出4次

 

方案一:掃描數組,記錄第一個出現的k和最後一個k中間有多少個,時間復雜度為O(n)

方案二:由於數組是有序的,那麼我們可以利用二分的思想,求出k在數組中的第一個位置和最後位置相減即可。時間復雜度為O(logN)

注意嚴格按照良好的C++編碼風格

 

 

#include
#include
#include
#include
using namespace std;

//規定沒有找到返回-1
int GetFirstIndex(int *arrNum, int left, int right, int k){
	if(arrNum == NULL || left > right){
	    return -1;
	}
	while(left <= right){
	    int mid = (left+right)>>1;
		if(arrNum[mid] > k){
		    right = mid-1;
		}
		else if(arrNum[mid] < k){
		    left = mid+1;
		}
		else{
			if((mid > 0) && (arrNum[mid-1] == k)){
			    right = mid-1;
			}
			else{
			    return mid;
			}
		}
	}
	return -1;
}

//規定沒有找到返回-1
int GetLastIndex(int *arrNum, int left, int right, int k){
	if(arrNum == NULL || left > right){
	    return -1;
	}
	while(left <= right){
	    int mid = (left+right)>>1;
		if(arrNum[mid] > k){
		    right = mid-1;
		}
		else if(arrNum[mid] < k){
		    left = mid+1;
		}
		else{
			if((mid < right-1) && (arrNum[mid+1] == k)){
			    left = mid+1;
			}
			else{
			    return mid;
			}
		}
	}
	return -1;
}

int main(){
	int arrNum[] = {1,2,3,3,3,3,4,5};
	//求出第一個和最後一個位置
	int firstIndex = GetFirstIndex(arrNum, 0, 7, 3);
	int lastIndex = GetLastIndex(arrNum, 0, 7, 3);
	if(firstIndex != -1 && lastIndex != -1){
	    cout<<(lastIndex-firstIndex+1)<

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved