leetCode–169(多数元素)
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
示例 2:
1 2
| 输入:nums = [2,2,1,1,1,2,2] 输出:2
|
解法一:哈希表
使用hash表来存放每个元素出现的次数,最后遍历hash 返回次数 > len/2 的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int majorityElement(int[] nums) { int n = nums.length; if (n<=2) return nums[0]; int len = n/2; Map<Integer,Integer> map = new HashMap<>(); for (int i = 0;i<n;i++){ if (map.containsKey(nums[i])) map.put(nums[i],map.get(nums[i])+1); else map.put(nums[i],1); } for (int key:map.keySet()){ if (map.get(key)>len) return key; } return -1; } }
|
解法二:排序
我的:先对数组进行排序,后进行遍历。。
我:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int majorityElement(int[] nums) { int n = nums.length; if (n<=2) return nums[0]; int len = n/2; Arrays.sort(nums); int count = 0; for (int i = 0;i<n-1;i++){ if (nums[i]==nums[i+1]) count = count + 1; else count = 0; if (count+1>len) return nums[i]; } return -1; } }
|
傻呀傻,,看看人家官方的。。充分利用了众数的性质。
代码为:
1 2 3 4 5 6
| class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; } }
|
绝了!
解法三:投票方法
如果遇见相等的数加1,遇见不相等的数减 1.
众数个数至少比非众数多一,把COUNT加减当作一个众数抵消掉一个非众数,剩下的一定是众数。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int majorityElement(int[] nums) { int n = nums.length; if (n<=2) return nums[0]; int count = 0; int a = 0; for (int i = 0;i<n;i++){ if (count==0) a = nums[i]; count += (nums[i]==a)?1:-1; } return a; } }
|
解法四:分治算法
没看懂~~