LeetCode-169. 多数元素(C语言)

这篇具有很好参考价值的文章主要介绍了LeetCode-169. 多数元素(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、题目描述

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

二、示例与提示

示例 1:

输入: nums = [3,2,3]
输出: 3

示例 2:

输入: nums = [2,2,1,1,1,2,2]
输出: 2

提示

  • n == nums.length
  • 1 <= n <= 5 * 104
  • 1 <= n <= 5 * 104

进阶: 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

三、思路

拿到本题首先想到的是使用哈希思想,新建立一个数组arr,将nums数组中的各元素映射到arr中,最终返回arr数组中值最小的元素下标。后来发现此方法存在bug,若nums数组中的元素为负,则arr数组下标就无法满足条件。下面介绍一个巧妙的方法,可以比较形象的模拟此题过程:

军队争高地法:

本题可以将数组中各个元素看成不同的军队,根据题目中描述:多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。也就是说多数元素是所有军队中士兵数量最多的那支军队(因为元素个数大于n/2)。
首先假设第一个元素为多数元素(即第一支军队占领高地),在遍历数组的过程中,若遇到相同元素,则当前军队增加一个士兵,反之则被其他军队消灭一个士兵,若此军队在高地上驻扎的士兵全部被消灭,则下一军队占领高地,直到最后返回占领高地的军队(即多数元素)。

四、代码

int majorityElement(int* nums, int numsSize) {
	int res = nums[0]; // 第一支占领高地的军队
	int count = 0; // 此军队当前士兵数量为0
	for (int i = 0; i < numsSize; i++) {
	// 若遇到相同元素,则当前军队增加一个士兵
		if (nums[i] == res) {
			count++;
		}
	// 反之,当前军队被消灭一个士兵
		else {
			count--;
			// 若高地军队全军覆没,则下一军队占领高地
			if (count <= 0)
				res = nums[i + 1];
		}
	}
	// 返回最后占领高地军队
	return res;
}

复杂度分析

时间复杂度: O(n)文章来源地址https://www.toymoban.com/news/detail-734864.html

到了这里,关于LeetCode-169. 多数元素(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 169. 多数元素

            本题我的思路是将数组nums中的元素以及其出现次数保存至一个哈希表hashMap中,然后找到哈希表中大于 ⌊n/2⌋ 的value值,并返回对应的key即可。 java代码如下:

    2024年02月06日
    浏览(28)
  • 力扣-169. 多数元素

    力扣题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums = [3,2,3] 输出:3 示例 2: 输入:nums = [2,2,1,1,1,2,2] 输出:2 代码 方法

    2024年02月21日
    浏览(19)
  • int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」

    输出: 众所周知,将普通数组转为List集合,可以通过JDK提供的诸多方法来减轻我们的编码负担,所以接下来小名借用两个leetcode题中的场景来分享下数组转集合的使用方法: 看到开头的 「int[ ]转Integer[ ]」 可能有的小伙伴并不知道什么情况会用。当然平日开发我们断然不会

    2024年02月14日
    浏览(37)
  • 169. 多数元素

    原理 就是互相抵消,最后肯定是元素数量多的那个元素票数不为0

    2024年02月15日
    浏览(31)
  • 力扣(LeetCode)算法_C++—— 存在重复元素

    给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums = [1,2,3,1] 输出:true 示例 2: 输入:nums = [1,2,3,4] 输出:false 示例 3: 输入:nums = [1,1,1,3,3,4,3,2,4,2] 输出:true 提示: 1 = nums.length = 105 -1

    2024年02月09日
    浏览(37)
  • 169. 多数元素(摩尔投票法) 题解

    给定一个大小为  n   的数组  nums  ,返回其中的多数元素。多数元素是指在数组中出现次数  大于   ⌊ n/2 ⌋  的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 : 可以使用摩尔投票算法(Boyer-Moore Voting Algorithm)来解决这个问题,它是解决这

    2024年02月12日
    浏览(25)
  • 力扣(LeetCode)算法_C++——存在重复元素 II

    存在重复元素 II 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) = k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3 输出:true 示例 2: 输入:nums = [1,0,1,1], k = 1 输出:true 示例

    2024年02月09日
    浏览(29)
  • 【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转

    ========================================================================= 个人主页直达: 小白不是程序媛 LeetCode系列专栏: LeetCode刷题掉发记 ========================================================================= 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数

    2024年02月08日
    浏览(36)
  • 【leetcode 力扣刷题】移除链表元素 多种解法

    题目链接:203.移除链表元素 题目内容: 理解题意:就是单纯的删除链表中所有值等于给定的val的节点。上一篇博客中介绍了链表的基础操作,在删除链表中节点时,需要注意的是头节点: 如果没有虚拟头节点,那么对头节点的删除需要做不同的处理,head = head-next; 如果有

    2024年02月12日
    浏览(35)
  • 力扣(LeetCode)算法_C++—— 快乐数

    编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包