zoukankan      html  css  js  c++  java
  • 1224. 最大相等频率

    2020-04-02 12:15:05

    问题描述:

    给出一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回其长度:

    从前缀中删除一个元素后,使得所剩下的每个数字的出现次数相同。
    如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是 0 次)。

    示例 1:

    输入:nums = [2,2,1,1,5,3,3,5]
    输出:7
    解释:对于长度为 7 的子数组 [2,2,1,1,5,3,3],如果我们从中删去 nums[4]=5,就可以得到 [2,2,1,1,3,3],里面每个数字都出现了两次。

    示例 2:

    输入:nums = [1,1,1,2,2,2,3,3,3,4,4,4,5]
    输出:13

    提示:

    2 <= nums.length <= 10^5
    1 <= nums[i] <= 10^5

    问题求解:

    如果正序的来求解的话,需要讨论的情况会非常多,直接导致最后求解非常麻烦;这个时候我们需要做的更多的是从另一个角度来看待问题,往往会使问题解决变得更加简单清晰。

    对于本题而言,可以反向遍历,如果当前满足条件直接返回结果即可。

    如何对每一位进行判断呢?对于末尾某一位,我们可以选择删除或者保留,我们只需要针对这两种方案进行判别即可。

    时间复杂度:O(n)

        int[] num2freq = new int[100001];
        int[] freq2num = new int[100001];
        public int maxEqualFreq(int[] nums) {
            int n = nums.length;
            for (int num : nums) {
                num2freq[num]++;
                freq2num[num2freq[num]]++;
            }
            for (int i = n - 1; i >= 1; i--) {
                int num = nums[i];
                // delete prev
                if (num2freq[nums[i]] * freq2num[num2freq[nums[i]]] == i) return i + 1;
                
                // delete curr
                freq2num[num2freq[num]]--;
                num2freq[num]--;
                if (num2freq[nums[i - 1]] * freq2num[num2freq[nums[i - 1]]] == i) return i + 1;
                
            }
            return 1;
        }
    

      

  • 相关阅读:
    Oracle Hint的用法
    利用flashback transaction query新特性进行事务撤销
    存储的一些基本概念(HBA,LUN)
    SAN和NAS
    SAN (Storage Attached Network),即存储区域网络
    深入浅出谈存储之NAS是什么
    对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
    Oracle的体系结构
    利用360免费wifi搭建局域网让他人访问Oracle数据库
    杭电ACM id:3783
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12619042.html
Copyright © 2011-2022 走看看