九日集训(第五天)排序

60 阅读2分钟

九日集训(第五天)排序

三、课后习题

课后所有习题,在上文都能找到答案,所以务必全部刷完。

第五天了,有什么感觉吗?昨天的指针相比是吃下了,C语言的最难点已经告一段落了,接下来就享受刷题的狂欢吧。其实举办这个九日集训的目的,最终还是为了让大家养成习惯,习惯刷题并且爱上它,我相信,到了后面你自己也会忍不住自己找题来刷。坚持!加油!你可以的!

排序数组

多数元素

存在重复元素

最大间距

按奇偶排序数组

最小时间差

169. 多数元素

#include <vector>
#include <unordered_map>

class Solution {
public:
    int majorityElement(std::vector<int>& nums) {
        int count = 0;
        int candidate = 0;

        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }

        return candidate;
    }
};

解释:

这个解法使用的是摩尔投票法(Boyer-Moore Voting Algorithm),它是一种在时间复杂度为O(n)且空间复杂度为O(1)的情况下找出数组中多数元素的有效算法。基本思想是,多数元素的个数比其他所有元素的个数加起来还要多,所以可以通过计数的方法来找到它。

算法步骤如下:

  1. 维护一个候选元素candidate和一个计数器count。初始时,任选数组中的一个元素作为候选元素,计数器为1。
  2. 遍历数组中每个元素,对于当前元素num
    • 如果计数器为0,我们假设当前元素是多数元素,因此将candidate设置为num,并将count设为1。
    • 如果计数器不为0,我们将当前元素numcandidate比较:
      • 如果它们相等,则增加计数器。
      • 如果它们不等,则减少计数器。
  3. 在数组遍历完成后,candidate即为多数元素。

由于题目已经假设一定存在一个多数元素,因此上述算法可以直接返回最后的candidate作为答案。如果没有这个假设,我们还需要遍历数组来验证candidate是否真的是多数元素。