229. Majority Element II

因为要找出现次数大于1/3的数,所以就是要找出现次数最多的2个数,并且次数要超过Len/3

维持最频繁的两个数的思路:

如果当前数和ele1相同

  cnt1++;

否则,如果当前数和ele2相同(与ele1不同,但是与ele2相同)

  cnt2++;

否则,如果如果cnt1 == 0(当前数和ele1与ele2都不同的新数,而且已经没有ele1了) 

  cnt1 = 1

  ele1 = 当前数

否则, 如果cnt2 == 0

  cnt2 = 1;

  ele2 = 当前数

否则(该数是不同的数,只用来抵消)

  cnt1--;

  cnt2--;

最后ele1和ele2就是最频繁的两个

 

但是作为整个算法,还需要再走一遍,因为我们虽然找到最频繁的这两个数,但是这两个数未必出现次数超过1/3了,所以从头数一遍

1         Arrays.fill(cnt, 0);
2         for(int i = 0; i < nums.length; i++) {
3             if(nums[i] == ele[0]) {
4                 cnt[0]++;
5             } else if(nums[i] == ele[1]) {
6                 cnt[1]++;
7             }
8         }

然后返回大于出现1/3的

 

 1     public List<Integer> majorityElement(int[] nums) {
 2         List<Integer> res = new ArrayList<Integer>();
 3         if(nums.length == 0) {
 4             return res;
 5         }
 6         int[] ele = new int[2];
 7         int[] cnt = new int[2];
 8         ele[0] = 0;
 9         ele[1] = 1;
10         for(int i = 0; i < nums.length; i++) {
11             if(nums[i] == ele[0]) {
12                 cnt[0]++;
13             } else if(nums[i] == ele[1]) {
14                 cnt[1]++;
15             } else if(cnt[0] == 0) {
16                 cnt[0] = 1;
17                 ele[0] = nums[i];
18             } else if(cnt[1] == 0) {
19                 cnt[1] = 1;
20                 ele[1] = nums[i];
21             } else {
22                 cnt[0]--;
23                 cnt[1]--;
24             }
25         }
26         Arrays.fill(cnt, 0);
27         for(int i = 0; i < nums.length; i++) {
28             if(nums[i] == ele[0]) {
29                 cnt[0]++;
30             }
31             if(nums[i] == ele[1]) {
32                 cnt[1]++;
33             }
34         }
35         if(cnt[0] > nums.length / 3) {
36             res.add(ele[0]);
37         }
38         if(cnt[1] > nums.length / 3) {
39             res.add(ele[1]);
40         }
41         return res;
42     }

 

posted @ 2016-07-28 09:46  warmland  阅读(131)  评论(0编辑  收藏  举报