LeetCode 算法:多数元素 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

-109 <= nums[i] <= 109

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

题解

  1. 解题思路:

LeetCode上的"多数元素"问题是一个经典的算法题目,其目标是在一个非空数组中找到出现次数超过一半的元素。这个问题可以通过多种方法解决,以下是几种常见的解题思路:

  1. 暴力解法:遍历数组,对每个元素进行计数,然后找出出现次数超过数组长度一半的元素。这种方法的时间复杂度是O(n^2),空间复杂度是O(1)。

  2. 排序法:首先对数组进行排序,然后返回中间的元素,因为出现次数超过一半的元素在排序后数组中一定是中间的元素。这种方法的时间复杂度是O(nlogn),因为排序的开销。

  3. 摩尔投票法:这是一种时间复杂度为O(n),空间复杂度为O(1)的方法。算法的基本思想是利用候选人的正票数和负票数的抵消问题。多数元素的票数一定是大于n/2的,所以抵消后,票数一定是一个正数,最终胜出。

  4. 位运算:使用位运算的方法,首先预设一个整型变量,由于整型变量是32位的,就可以根据后面的判断把应该是1的位置置1,其余还是0,转为十进制就是要求的多数元素。这种方法的时间复杂度是O(n),空间复杂度是O(1)。

  5. 使用哈希表:遍历数组,使用哈希表记录每个元素的出现次数,然后找到出现次数大于数组长度一半的元素。这种方法的时间复杂度是O(n),空间复杂度是O(n)。

  6. 摩尔投票法的推广:如果需要找到出现次数最多的两个或多个元素,可以扩展摩尔投票法,维护多个数字和计数器,这种方法的时间复杂度是O(n),空间复杂度是O(1)。

在实际应用中,如果对时间效率要求较高,可以选择摩尔投票法或位运算方法来实现;如果对代码简洁性要求较高,可以使用哈希表方法。无论使用哪种方法,都需要对算法的时间复杂度和空间复杂度进行评估和优化。

  1. c++ demo:排序法
cpp 复制代码
#include <vector>
#include <algorithm> // 用于std::sort

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        // 对数组进行排序
        sort(nums.begin(), nums.end());
        // 返回中间的元素
        return nums[nums.size() / 2];
    }
};

// 主函数,用于测试
int main() {
    Solution solution;
    
    // 测试用例1
    vector<int> nums1 {3,2,3};
    int result1 = solution.majorityElement(nums1);
    cout << "Test Case 1: Input [3,2,3], Output: " << result1 << endl; // 应输出3
    
    // 测试用例2
    vector<int> nums2 {2,2,1,1,1,2,2};
    int result2 = solution.majorityElement(nums2);
    cout << "Test Case 2: Input [2,2,1,1,1,2,2], Output: " << result2 << endl; // 应输出2
    
    return 0;
}
相关推荐
前端小L14 分钟前
贪心算法专题(十三):画地为牢的艺术——「划分字母区间」
javascript·算法·贪心算法
@小码农16 分钟前
202512 电子学会 Scratch图形化编程等级考试三级真题(附答案)
服务器·开发语言·数据结构·数据库·算法
橘颂TA34 分钟前
【剑斩OFFER】算法的暴力美学——重排链表
算法·结构与算法
zl_vslam44 分钟前
SLAM中的非线性优-3D图优化之相对位姿Between Factor位姿图优化(十三)
人工智能·算法·计算机视觉·3d
千里马-horse1 小时前
Rect Native bridging 源码分析--AString.h
c++·ts·rn·jsi
Timmylyx05181 小时前
CF 新年赛 Goodbye 2025 题解
算法·codeforces·比赛日记
闻缺陷则喜何志丹1 小时前
【二分查找】P10091 [ROIR 2022 Day 2] 分数排序|普及+
c++·算法·二分查找
only-qi1 小时前
leetcode2. 两数相加
算法·leetcode
鲨莎分不晴1 小时前
拯救暗淡图像:深度解析直方图均衡化(原理、公式与计算)
人工智能·算法·机器学习
DuHz1 小时前
242-267 GHz双基地超外差雷达系统:面向精密太赫兹传感与成像的65nm CMOS实现——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达