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 }