1. 程式人生 > >劍指offer——(5)陣列中出現次數超過一半的數字

劍指offer——(5)陣列中出現次數超過一半的數字

三種思路可選。 

public class Solution {
/*
    渣渣暴力求解法:時間複雜度為n!,從0位遍歷陣列,與當前位置的下一位數字判斷是否相等,相等則
    count+1,將出現次數用countTemp儲存,每次迴圈比較一下有沒有出現次數更多的數字,迴圈結束時
    num已經儲存了陣列中出現次數最多的那個數字,而count儲存的是num出現的次數。
*/
    public int MoreThanHalfNum_Solution(int [] array) {
        int num = 0,countTemp = 1,temp = 0,length = array.length;
        if(length==1) return array[0]; //若陣列只有一個數,滿足題目要求,將該數返回即可
        for(int i=0;i<length;i++) {
        	int count = 1;
        	temp = array[i];
        	for(int j=i+1;j<length;j++) {
        		if(array[j]==temp) {
        			count++;
        		}
        	}
        	if(countTemp < count) {
        		countTemp = count;
            	num = temp;
        	}
        }
    //按題目要求num出現的次數必須大於陣列的一半 否則返回0
         if((length%2==0&&countTemp<=length/2)||(length%2!=0&&countTemp<=length/2))
        	return 0;
    	return num;
    }
}
public class Solution {
/*
    初始化一個變數num儲存陣列第一個數,遍歷陣列,依次判斷陣列中的值有否與其相等,是則count++,
    否則count--,當count減到為零時,重新賦值為一,並將當前數值賦給num,此法可以找出陣列中出現
    次數最多的數字找出。
*/
    public int MoreThanHalfNum_Solution(int [] array) {
       int num = array[0],count = 1;
    	for(int i=1;i<array.length;i++) {
    		if(count==0) {
    			num = array[i];
    			count = 1;
    		}
    		else if(num==array[i]) count++; 
    		else count--;
    	}
    	//count能幫助篩選出出現次數最多的數字 但此時他儲存的並不是出現次數最多數字的次數
    	count = 0;
    	for(int i=0;i<array.length;i++) {
    		if(num==array[i]) count++;
    	}
        //如果陣列中出現次數最多的數字出現次數都沒有超過陣列長度一半,根據題意該數字不存在返回0
    	if(count>array.length/2) return num;
    	else return 0;
    }
}
import java.util.Arrays;
public class Solution {
/*
    運用Java內建包的排序演算法將陣列排好序,若滿足題目條件,則陣列中間的數字,應該是
    出現次數最多的數字(出現次數超過一半),再通過一個迴圈判斷該數是否滿足題意即可。
*/
    public int MoreThanHalfNum_Solution(int [] array) {
        Arrays.sort(array);
    	int num = array[array.length/2],count = 0;
    	for(int i=0;i<array.length;i++) {
    		if(num==array[i]) count++;
    	}
    	if(count>array.length/2) return num;
    	else return 0;    	
    }
}