思路:
最简单的思路是hush的定址法统计各个数字的个数。最后遍历hush输出数量最多的。
这显然是非常的耗费空间。因为题目中并没有说明各个数字的大小的取值范围。
那么我们换一种方法: 用栈来解决问题
例如:
由上图我们可以得出以下的三个结论:
- 栈为空入栈
- 栈顶元素和与元素相等入栈
- 栈定和元素不相等出栈
其实用通俗易懂的话来说就是挨个比较不同的抵消了。那么留下来的就是数量最多的。
注意:
题目中有一个条件是多数元素的个数大于数组的1/2,正是因为这样才可以用这种方法。
如果不是那么该方法不能使用。
例如: 2 2 1 3 5 最后留下的是 5 这显然是不正确的。
代码如下:
int majorityElement(int* nums, int numsSize){
int *stack=(int *)malloc(sizeof(int)*numsSize);
int top=-1;
for(int i=0;i<numsSize;i++)
{
if(top==-1)//栈里没有元素,入栈
{
stack[++top]=nums[i];
continue;
}
if(nums[i]==stack[top])//相等入栈
{
stack[++top]=nums[i];
continue;
}
top--;//不相等,出栈
}
return stack[0];
}
这时候的时间复杂度是O(n),空间复杂度也是O(n)。
其实通过分析你会发现栈其实不用那么大,我们完全可以用一个元素来统计栈顶元素,
一个元素来统计个数。
代码如下:
int majorityElement(int* nums, int numsSize){
int count=0;
int number=0;
for(int i=0;i<numsSize;i++)
{
if(count==0)//栈为空入栈
{
number=nums[i];
count++;
continue;
}
else if(number==nums[i])
{
count++;
}
else//出栈
count--;
}
return number;
}
上面这种方法的时间复杂度为O(n),空间复杂度为O(0).
上面的总结是根据这个视频总结的:
https://www.bilibili.com/video/BV13s41197my