主元素 II

主元素 II

给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

样例

给出数组[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 }
View Code

 

posted @ 2015-12-04 16:19  -.-|  阅读(250)  评论(0编辑  收藏  举报