题意:

image.png

解题思路:

  1. 思路:(投票算法) O(n)
  2. 1. 定义cnt记录次数,初始化0num记录答案;
  3. 2. 从头开始遍历,如果cnt == 0,则num = v,如果num == v,则增加cnt++[出现次数],否则cnt--;
  4. 3. 遍历结束,剩下的元素则为要找的元素;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer
  5. */
  6. function majorityElement($nums) {
  7. return $this->majorityElementStack($nums);
  8. $ret = $nums[0];
  9. $midV = (int)count($nums) / 2;
  10. $temp = [];
  11. foreach ($nums as $item) {
  12. if (isset($temp[$item])) {
  13. $temp[$item]++;
  14. if ($temp[$item] > $midV) $ret = $item;
  15. } else $temp[$item] = 1;
  16. }
  17. return $ret;
  18. }
  19. function majorityElement1($nums) {
  20. $num = $nums[0];
  21. $cnt = 1;
  22. for ($i = 1; $i < count($nums); $i++) {
  23. if ($cnt == 0) {
  24. $num = $nums[$i];
  25. $cnt = 1;
  26. } else if ($nums[$i] == $num) {
  27. ++$cnt;
  28. } else --$cnt;
  29. }
  30. return $num;
  31. }
  32. function majorityElementStack($nums) {
  33. $stack = [];
  34. foreach ($nums as $num) {
  35. if (empty($stack) || end($stack) == $num) {
  36. $stack[] = $num;
  37. } else {
  38. array_pop($stack);
  39. }
  40. }
  41. return end($stack);
  42. }
  43. }

go代码实现:

  1. func majorityElement(nums []int) int {
  2. num, cnt := 0, 0
  3. for _, v := range nums {
  4. if cnt == 0 {
  5. num = v
  6. }
  7. if num == v {
  8. cnt++
  9. } else {
  10. cnt--
  11. }
  12. }
  13. return num
  14. }