标签:
给出数组[1,2,1,2,1,3,3] 返回 1
数组中只有唯一的主元素
要求时间复杂度为O(n),空间复杂度为O(1)。
嗯。。 百度了一下。
主元素可能有两个,于是设置两个当前主元素。遍历nums,如果和某个当前住元素相等,则计数加一。如果都不相等
计数减一,若减后计数小于等于0,则将对应的当前住元素更换。
最后需要验证,应为当前主元素只有一个,候选有两个。
lintcode上还有个主元素III,想了一下用这种方法也可以做,但是时间复杂度就是O(n*k)了。
1 public class Solution { 2 /** 3 * @param nums: A list of integers 4 * @return: The majority number that occurs more than 1/3 5 */ 6 public int majorityNumber(ArrayList<Integer> nums) { 7 int n = nums.size(); 8 int max = nums.get(0); 9 int max1 = -1; 10 int x = 1; 11 int x1 = 0; 12 for(int i=1;i<n;i++) { 13 int m = nums.get(i); 14 if(m == max) x++; 15 else if(m == max1) x1++; 16 else if(x == 0) { 17 max = m; 18 x = 1; 19 }else if(x1 == 0) { 20 max1 = m; 21 x1 = 1; 22 }else { 23 x--; 24 x1--; 25 } 26 27 if(3*x > n)return max; 28 if(3*x1 > n)return max1; 29 } 30 x=0; 31 x1=0; 32 for(int i=0;i<n;i++) { 33 if(nums.get(i) == max)x++; 34 if(nums.get(i) == max1)x1++; 35 } 36 if(3*x >n) return max; 37 return max1; 38 } 39 }
标签:
原文地址:http://www.cnblogs.com/FJH1994/p/5019637.html