力扣题解——6927. 合法分割的最小下标

        首先大家要找到一个重点,支配数也就是众数,在分割前它是整个数组nums的支配数,在满足题目要求“分开后的两个子数组的众数相同” 这个前提下,原数组的众数和分开数组后的众数一定是同一个

        此处稍微用逻辑推理一下即可:以前众数X的数量大于nums.size()/2,在分开后,如果子数组1中众数X的数量比较少,导致X不是这个数组的众数,那么在另外一个子数组2中众数X的数量一定“超标”,它一定会是众数!

        这与题目要求形成悖论,所以在这个前提下,我写出如下代码: 思路为用两个哈希表存储数及其出现次数。首先在填充一个哈希表m2时找到众数,逐渐将数添加进另一个哈希表m1时,在众数发生变化进行判断。

class Solution {
public:
    int minimumIndex(vector& nums) {
        if (nums.size()<=1)
        {
            return -1;
        }
        unordered_map m1,m2;
        int zhipei,frq=0;
        for (int i = 0; i < nums.size(); i++)
        {
            m2[nums[i]]++;
            if(m2[nums[i]]>frq) {
                frq=m2[nums[i]];
                zhipei=nums[i];
            }
        }
        int mid=0;//mid就是答案中分界的下标,取左数组的最后一个数的下标
        while (mid mid+1 && m2[zhipei]*2 > nums.size()-mid-1 ) return mid;
            mid++;
        }
        return -1;
    }
};

如果有帮助到你,请给我免费点赞收藏关注,这是我写文章的最大动力!

你可能感兴趣的:(leetcode,算法,c++)