劍指offer——(5)陣列中出現次數超過一半的數字
阿新 • • 發佈:2018-11-12
三種思路可選。
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; } }