踏踏实实积累,不要浮躁!!!
LeetCode https://leetcode-cn.com/problems/majority-element/
思路:
1:利用Map 来计数每个元素出现的次数 因为题目明确表示测试用例中肯定有 众数,
class Solution {
public int majorityElement(int[] nums) {
int tmp;
int base = nums.length / 2;
Map<Integer,Integer> map = new HashMap();
if(nums.length == 1){
return nums[0];
}
for(int i = 0;i<nums.length;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
tmp = map.get(nums[i]) + 1;
if(tmp > base){
return nums[i]; // 这里肯定会返回
}
map.put(nums[i],tmp);
}
}
return Integer.MIN_VALUE; //
}
}
思路2: 上面的解法时间复杂度比较高,下面介绍一种思想 随机取一个数判断这个数出现的次数是不是大于数组长度的一半。这种解法速度提升很快。
package LeetCodePractice;
import java.util.*;
/**
* 随机取一个数,然后判断这个数出现的次数 是不是 比 n/2 要大
* 因为 一个数组中只可能存在一个数 出现的次数大于 n/2
*/
public class MajorityElement2 {
private int randRange(Random rand, int min, int max) {
return rand.nextInt(max - min) + min;
}
private int countOccurences(int[] nums, int num) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == num) {
count++;
}
}
return count;
}
public int majorityElement(int[] nums) {
Random rand = new Random();
int majorityCount = nums.length/2;
while (true) {
int candidate = nums[randRange(rand, 0, nums.length)];
if (countOccurences(nums, candidate) > majorityCount) {
return candidate;
}
}
}
public static void main(String[] args) {
MajorityElement2 maj = new MajorityElement2();
int[] nums = {2,2,1,1,1,2,2};
int rel = maj.majorityElement(nums);
System.out.println(rel);
}
}