找出出現次數站數據總數一半以上的數據

假設數組類型爲整形數組編程

  • 首先想到的思路是對每一個出現過的數據進行個數統計,藉助一個鍵值對集合,存放不一樣的數據及對應的出現的次數。出現次數大於N/2的即爲要獲得的結果。當數據量大的時候,會消耗空間。數組

  • 第二種思路是對已有的數據進行排序,排序以後相同的數據時連續的,又由於目標數據的出現次數大於N/2,因此下標在N/2的數據必定要找的數據。時間複雜度爲O(N*logN)code

  • 前兩種思路要麼要藉助其餘空間,要麼時間複雜度高。下面介紹第三種思路。排序

    若是咱們每次刪除兩個不一樣的數據,那麼該數在剩餘的數據中仍然佔大於N/2的比例,經過不斷的刪除,把大的問題簡化成小的問題,就能夠簡便的求解。get


int calculate(int a[],int n)
{
        //target爲要找的數據
	int target=0;
	int times=0;
	for(int i = 0;i<n;i++)
	{
	        //若是times爲0,標誌着前面的數據已刪除,從剩下的數據中開始查找
		if(times==0)
		{
		        //將當前位置的數據假設爲target
			target=a[i];
			times=1;
		}
		else
		{
			if(target==a[i])
			{
				times++;
			}
			else
			{
				times--;
			}
		}
	}
	return target;
}


參考書籍:《編程之美》class

相關文章
相關標籤/搜索