1. 程式人生 > >數組中出現次數超過一半的數字

數組中出現次數超過一半的數字

++ ros 處理 temp track urn 宋體 一個 pan

??

劍指OfferP163

題目:找出數組中一個出現次數超過整個數組長度一般的數字

解法一:將原問題轉化為求數組的中位數,採用高速排序的思想,每一次Partition取末位為哨兵,遍歷將小於、大於哨兵的數分別移至哨兵左右,最後返回哨兵在處理後的數組中的位置。不斷縮小要處理的數組的長度大小。終於確定返回值為數組長度一半的元素。即為中位數。

解法二:因為題設該數字出現的次數大於其它全部數字出現的次數。故用兩個變量,一個表示數字num_data,一個表示次數。當下一個數字等於num_data時。則times1。如若不等於,time1。直至times等於0,則將num_data

更換為下一個數字;由題知,最後得到的num_data的結果必為所要求得的值。

public class MoreThanHalfNum {

	/*****************實現方法一**********************/
	//解法一:基於Partition方法
	public int MoreThanHalfNum1(int[] data){
		if((data == null) || data.length == 0){
			return 0;
		}
		//先進行一次Partition
		int target = data.length >> 1;//目標index
		int start = 0;
		int end = data.length - 1;//設定默認初始值
		int index = Parttition(data, start, end);
		
		while(index != target){
			if(index < target)<span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位數在data[index]後半部分</span>
				start = index  + 1;
			}
			else   <span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位數在data[index]前半部分 </span>
				end = index - 1; 
			}
			index = Parttition(data, start, end);
		}
		//推斷找到的數在原數組是否確實有>n/2個
		return Judge(data, data[index]);
	}
	
	//推斷找到的數在原數組是否確實有>n/2個
	private int Judge(int[] data, int target_num){
		int times = 0;
		for(int num : data){
			if(num == target_num){
				times++;
			}
		}
		return times*2 > data.length ?

target_num : 0; } //高速排序的核心方法 private int Parttition(int[] data,int start,int end){ //選取哨兵 int mid_num = data[end]; int index = start;//位置記錄 for(int i = start; i < end; i++){ if(data[i] > mid_num){ swap(data, i, index); } else { index++ ; } } swap(data, index, end); return index; } //無法像C++一樣使用引用實現。故僅僅好使用data數組進行改變 private void swap(int[] data , int a, int b){ int temp = data[a]; data[a] = data[b]; data[b] = temp; } /*****************實現方法二******************/ public int MoreThanHalfNum2(int[] data){ if((data == null) || data.length == 0){ return 0; } int num = data[0];//記錄數據 int times = 1;//記錄次數 for(int data_num : data){ if(0 == times){ num = data_num; times ++; } else if(num == data_num){ times++; } else{ times--; } } return Judge(data, num); } public static void main(String[] args) { int[] data = {1,2,3,2,2,2,5,4,2}; MoreThanHalfNum moreThanHalfNum = new MoreThanHalfNum(); System.out.println(moreThanHalfNum.MoreThanHalfNum2(data)); } }


數組中出現次數超過一半的數字