159.majority element

分析过程:在这个题目中,有一个计算机科学中很普遍的思想,就是如何把一个问题转化为规模较小的若干问题。分治、递归和贪心等都有这样的思想。在转化过程中,如果能保证小的问题跟原问题的解决是一致的就成功了。这样,我们可以通过寻找这样的方式将小问题转化为更小的问题。这需要我们将大问题拆成小问题,将大规模的数据降成小规模的数据,而不影响解。

问题解法
如果每次删除不同的数,不管删除的数是否包含众数,在剩下的数中,众数出现的次数仍然超过总数的一半,可以通过不断重复这个过程,将列表中的数的总数降低,从而得到问题的答案。总的时间复杂度为o(n),且只需要常数的额外内存。
数组中有个数字出现的次数超过了数组长度的一半。也就是说,有个数字出现的次数比其他所有数字出现的次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值,一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数增加1。如果下一个数字和我们之前保存的数字不同,则次数减1。如果次数为0,我们就保存下一个数字,并把次数重新设为1。

实现代码

int majorityElement(vector<int>& nums) {
		int times=0;
		int canadite;
		int length = nums.size();
		for (int i = 0; i < length; i++) {
			if (times == 0) {
				canadite = nums[i];
				times++;
			}
			else {
				if (nums[i] == canadite) {
					times++;
				}
				else {
					times--;
				}
			}
		}
		return canadite;
	}

猜你喜欢

转载自blog.csdn.net/kking_edc/article/details/82829297
今日推荐