力扣:169. 多数元素

在这里插入图片描述
思路:
最简单的思路是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

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/115026322
今日推荐