1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| package questions;
import java.util.Arrays; import java.util.HashMap; import java.util.Map;
public class _169多数元素 {
public int majorityElement_brute(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); int n = nums.length; int half = n / 2; for (int num : nums) { int cnt = map.getOrDefault(num, 0) + 1; if(cnt > half){ return num; }else { map.put(num, cnt); } } return -1; }
public int majorityElement_sort(int[] nums) { Arrays.sort(nums); return nums[nums.length / 2]; }
public int majorityElement_random(int[] nums) { int n = nums.length; int half = n / 2,cnt=0,res = nums[0],next=nums[0],idx=0; boolean flag = true; while (cnt<=half){ cnt = 0; res = next; flag = true; for (int i = 0; i < n; i++) { if(nums[i]==res){ cnt++; if(cnt>half) return res; }else { if(flag&&idx<i){ idx = i; next = nums[i]; flag = false; } } } } return res; }
public int majorityElement_divide(int[] nums) { int n = nums.length; int res = nums[0]; majorityElement_divide_conquer(nums, 0, n/2); majorityElement_divide_conquer(nums, n/2, n); for (Map.Entry<Integer, Integer> integerIntegerEntry : mapMode.entrySet()) { if(integerIntegerEntry.getValue()>n/2){ return integerIntegerEntry.getKey(); } } return -1; } Map<Integer,Integer> mapMode = new HashMap<>(); public int majorityElement_divide_conquer(int[] nums, int left, int right) { if(left==right) return nums[left]; int mid = (right-left) / 2+left; int newLeft = majorityElement_divide_conquer(nums, left, mid); int newRight = majorityElement_divide_conquer(nums, mid + 1, right); if (newLeft == newRight) { return left; } int leftCount = countInRange(nums, newLeft, left, right); int rightCount = countInRange(nums, newRight, left, right); return leftCount > rightCount ? left : right; } private int countInRange(int[] nums, int num, int lo, int hi) { int count = 0; for (int i = lo; i <= hi; i++) { if (nums[i] == num) { count++; } } return count; }
public int majorityElement_boyer_moore(int[] nums) { int cnt = 0, res = 0; for (int num : nums) { if(cnt==0){ res = num; cnt++; }else { if(res==num){ cnt++; }else { cnt--; } } } return res; }
}
|