题目描述:

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

  1. 输入: [3,2,3]
  2. 输出: 3

示例 2:

  1. 输入: [2,2,1,1,1,2,2]
  2. 输出: 2

算法实现:

暴力法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var majorityElement = function(nums) {
  6. var mid = Math.ceil(nums.length / 2)
  7. if (nums.length === 1) {return nums[0]}
  8. for (var i = 0; i <= mid; i++ ) {
  9. var count = 1
  10. for (var j = i + 1; j < nums.length; j++ ) {
  11. if (nums[j] === nums[i]) {
  12. count++
  13. }
  14. if (count >= mid) {
  15. return nums[i]
  16. }
  17. }
  18. }
  19. };

投票法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var majorityElement = function(nums) {
  6. var help = 0
  7. var count = 0
  8. for (var i = 0; i < nums.length; i++ ) {
  9. if (count === 0) {
  10. help = nums[i]
  11. }
  12. if (help !== nums[i]) {
  13. count--
  14. } else {
  15. count++
  16. }
  17. }
  18. return help
  19. };

思考:

暴力法效率极低,利用双循环的方法,而投票法单次循环就可完成,值得借鉴。

总结:

学到了投票法。