1. 程式人生 > >劍指offer-數字在排序陣列中出現的次數(陣列)

劍指offer-數字在排序陣列中出現的次數(陣列)

 

題目描述

統計一個數字在排序陣列中出現的次數。

方法一:最簡單粗暴的方法就是遍歷!等於k就令count+1。這個方法是時間複雜度是O(n)。

class Solution{
public:
	int GetNumberOfK(vector<int> data,int k){
		if(data.size()<0)
			return 0;	
		int count=0;
		for(int i=0;i<data.size();i++)
		{
			if(data[i]==k)
				count++; 
		}
		return count;
	}
};

方法二:二分法!有人說看到有序陣列就要想到二分法!

用二分法找到這個數第一次出現和最後一次出現的下標。二分法的時間複雜度是O(logn)

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        return getlast(data,k)-getfirst(data,k)+1;
	}
	int getfirst(vector<int> data,int k){
		int start=0,end=data.size()-1;
		int mid;
		while(start<=end){
			mid=(start+end)/2;
			if(data[mid]<k)
				start=mid+1;
			else
				end=mid-1;
		}
		return start;
	}
	int getlast(vector<int> data,int k){
		int start=0,end=data.size()-1;
		int mid;
		while(start<=end){
			mid=(start+end)/2;
			if(data[mid]<=k)
				start=mid+1;
			else
				end=mid-1;
		}
		return end;
    }
};

方法三:同樣是基於二分法的思想,但是想法更加巧妙(這個方法是討論區裡的大神寫的,也一起總結到這裡)

因為陣列中的數是整數,所以加減0.5後,這個數可以插入到陣列中的哪個位置,然後相減

class Solution{
public:
	int GetNumberOfK(vector<int> data,int k){
		return find(data,k+0.5)-find(data,k-0.5);
	}
	int find(const vector<int> data,double num)
	{
		int start=0,end=data.size()-1;
		while(start<=end)
		{
			int mid=(start+end)/2;
			if(data[mid]<num)
				start=mid+1;
			else
				end=mid-1;
		}
		return start;
	}		
};