首页 > 其他分享 >169. 多数元素 ----- 摩尔投票法(两军相消剩一人)、随机化法、分治法、哈希表枚举法、排序法

169. 多数元素 ----- 摩尔投票法(两军相消剩一人)、随机化法、分治法、哈希表枚举法、排序法

时间:2022-11-15 21:15:15浏览次数:38  
标签:count 相消 return 枚举法 nums int lo 随机化 majority

给定一个大小为 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) 的算法解决此问题。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

摩尔投票:⭐最优解

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int m = 114514; // 初始化比较值为114214(可以是任意整数)
        int count = 0;  //计数器
        for (auto && num : nums) { // 遍历
            if (num == m) { // 相等就++
                count++;
            }
            else { // 不等就--
                count--;
            }
            if (count <= 0) { // 如果计数器<=0,说明相同的个数和不同的个数已经抵消,只要数组中存在过半值,那么不用担心找不到,同类与不同类相消最后一定剩下一个有最多同类的值。
                m = num;// 数组前方全被抵消,换下一个重新开始找同类
                count = 1; // 以他开始,所以至少有一个同类
            }
        }
        return m;
    }
};

 

哈希表法:

 

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> counts;
        int majority = 0, cnt = 0;
        for (int num: nums) {
            ++counts[num];
            if (counts[num] > cnt) {
                majority = num;
                cnt = counts[num];
            }
        }
        return majority;
    }
};

随机化法:

class Solution {
    private int randRange(Random rand, int min, int max) {
        return rand.nextInt(max - min) + min;
    }

    private int countOccurences(int[] nums, int num) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == num) {
                count++;
            }
        }
        return count;
    }

    public int majorityElement(int[] nums) {
        Random rand = new Random();

        int majorityCount = nums.length / 2;

        while (true) {
            int candidate = nums[randRange(rand, 0, nums.length)];
            if (countOccurences(nums, candidate) > majorityCount) {
                return candidate;
            }
        }
    }
}

排序法:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};

分治法:

class Solution {
    int count_in_range(vector<int>& nums, int target, int lo, int hi) {
        int count = 0;
        for (int i = lo; i <= hi; ++i)
            if (nums[i] == target)
                ++count;
        return count;
    }
    int majority_element_rec(vector<int>& nums, int lo, int hi) {
        if (lo == hi)
            return nums[lo];
        int mid = (lo + hi) / 2;
        int left_majority = majority_element_rec(nums, lo, mid);
        int right_majority = majority_element_rec(nums, mid + 1, hi);
        if (count_in_range(nums, left_majority, lo, hi) > (hi - lo + 1) / 2)
            return left_majority;
        if (count_in_range(nums, right_majority, lo, hi) > (hi - lo + 1) / 2)
            return right_majority;
        return -1;
    }
public:
    int majorityElement(vector<int>& nums) {
        return majority_element_rec(nums, 0, nums.size() - 1);
    }
};

 

标签:count,相消,return,枚举法,nums,int,lo,随机化,majority
From: https://www.cnblogs.com/slowlydance2me/p/16893923.html

相关文章

  • R数据分析:孟德尔随机化实操
    好多同学询问孟德尔随机化的问题,我再来尝试着梳理一遍,希望对大家有所帮助,首先看下图1分钟,盯着看将下图印在脑海中: 上图是工具变量(不知道工具变量请翻之前的文章)的模式......
  • 随机化算法解决圆排列问题 - python解法
    问题描述给定n个大小不等的圆,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给......
  • 力扣(leetcode) 53. 最大子序和 (暴力枚举法) 动态规划法待更新!!!!!
    题目在这:​​https://leetcode-cn.com/problems/maximum-subarray/​​法一:思路分析:直接两层暴力循环找最大的子序和,只能用于理解题目,leetcode上超时了…nums=[-10086......
  • 今天我们来聊一聊孟德尔随机化
    欢迎关注”生信修炼手册”!在传统的实验设计中,由于种种混杂因素的存在,我们仅仅能够分析变量之间的关联性,最典型的比如GWAS,对于显著的位点,只能够说明这些位点和性状之间存......
  • 孟德尔随机化中的无效工具变量检验
    ​两样本的孟德尔随机化研究只需要基于gwassummary数据,就可以研究暴露因素和结局变量之间的因果关系,是最广泛使用的研究手段之一。要保证MR研究结果的可靠性,需要在分析的各......
  • 孟德尔随机化研究中评估因果效应大小的方法
    欢迎关注”生信修炼手册”!孟德尔随机化研究借助遗传变异这一工具变量,来评估暴露因素与结局变量之间的因果效用。为了准确评估因果效应的大小,有多种方法相继被发明。本文重......
  • AtCoder Beginner Contest 272 G - Yet Another mod M // 随机化
    题目来源:AtCoderBeginnerContest272G-YetAnothermodM题目链接:ABC272G-YetAnothermodM题意给定一个大小为\(N\),元素各不相同的数组\(A\)。求一个数字\(......
  • 虫逢——随机化数据的随机化处理
    【清华集训2014】虫逢一道随机化数据的好题。题干小强和阿米巴是好朋友。阿米巴告诉小强,变形虫(又叫阿米巴虫)和绝大多数生物一样,也是有DNA的。并且,变形虫可以通过分......
  • 传统优化方法:枚举法、启发式算法和搜索算法
    1.枚举法枚举出可行解集合内的所有可行解,以求出精确最优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。当枚举空间比较大时......
  • 【Coel.学习笔记】随机化算法:模拟退火与爬山法
    简介模拟退火(\(\text{SimulateAnneal}\))和爬山法是随机化算法,二者的原理都在于通过随机生成答案并检查,把答案逐步缩小在一个可行的区间,尽可能地靠近正确答案。在考场......