剑指offer39:数组中出现次数超过一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数字中出现了5次,超过数组长度的一般,因此输出2。

分析:可以在遍历数组的时候,保存两个值:一个是数组中的一个数字,另一个是次数。当遍历到下一个数字的时候,如果和保存的数字相同,那么次数+1,如果和保存的数字不同,那么次数-1,当次数减为0的时候,把当前值保存起来,并将次数设为1。如果这个出现次数超过数字长度一般的数字真的存在,那么最后保存的数字就是要找的值。go代码实现:

 1 func majorityElement(nums []int) int {
 2     //检查参数合法性
 3     if len(nums) == 0 {
 4         return 0
 5     }
 6 
 7     //记录数字和次数
 8     num := nums[0]
 9     times := 1
10     for i := 1; i < len(nums); i++ {
11         if num == nums[i] {
12             //当前数字和已经记录的数字相等,次数+1
13             times++
14         } else {
15             //当前数字和已经记录的数字不相等,次数-1
16             times--
17             if times == 0 {
18                 //如果次数减为0了,就把记录的数字更新为当前数字,次数设为1
19                 num = nums[i]
20                 times++
21             }
22         }
23     } 
24 
25     //检查一下这个数字是不是真的出现次数超过数组长度一半
26     if checkMoreThanHalf(nums, num) {
27         return num
28     }
29 
30     return 0
31 }
32 
33 func checkMoreThanHalf(nums []int, num int) bool {
34     var times int
35     //先统计下求的结果在数组中出现的次数
36     for i := 0; i < len(nums); i++ {
37         if nums[i] == num {
38             times++
39         }
40     }
41 
42     //校验看这个数出现的次数是不是超过了数组长度的一半
43     if times * 2 <= len(nums) {
44         return false
45     }
46 
47     return true
48 }

 

posted @ 2022-02-08 22:36  星星里的花  阅读(31)  评论(0)    收藏  举报