最近一直在刷算法,在牛客上刷到了一题数组中出现次数超过一半的数字,题目大意如下。
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
本文章使用到了快速排序,对于快速排序这里不做过多讲解,如不了解可以查看对于快速排序的详细讲解。
思路分析
作为一个小菜鸡,第一想法是因为该数字出现次数超过数组长度的一半,所以排序后数组的中位数一定会是该数字。当然我们也不需要完全进行排序(事实上我们只需要知道在中位数上的值就行了)。自然而然想到了快排,每一次Partition排序返回的次序(后用index表示)后,如果需要寻找的中位值(后用target表示)==index,则直接返回arr[index],否则在对应区间Partion直到找出结果。
当然还有更好的思路,但这并不是本篇博客的重点。本篇博客的侧重点在于快速排序的解法。
代码实现
1 | array 传入的数组 |
这里着重分析的是getTarget
函数,在思路分析中我们已经知道了我们只是需要找到target = (start+end)/2
即可,利用partion
函数每次可得到一个值index,所有小于arr[index]
的值均位于index左部,大于arr[index]
的值位于右部,arr[index]
在arr
数组完全排序后次数为index
在这里将分情况讨论,如果获取的值index
恰好等于target
,则表明arr[index]
正是我们要找的值。否则如果target<index
将在index
的左部继续寻找,否则在右部寻找,具体代码如下
1 | if(target == index){ |
以上就是对于数组中出现次数超过一半的数字快速排序的解题思路。