• 【leetcode】1224. Maximum Equal Frequency


    题目如下:

    Given an array nums of positive integers, return the longest possible length of an array prefix of nums, such that it is possible to remove exactly one element from this prefix so that every number that has appeared in it will have the same number of occurrences.

    If after removing one element there are no remaining elements, it's still considered that every appeared number has the same number of ocurrences (0).

    Example 1:

    Input: nums = [2,2,1,1,5,3,3,5]
    Output: 7
    Explanation: For the subarray [2,2,1,1,5,3,3] of length 7, if we remove nums[4]=5, we will get [2,2,1,1,3,3], 
    so that each number will appear exactly twice.

    Example 2:

    Input: nums = [1,1,1,2,2,2,3,3,3,4,4,4,5]
    Output: 13
    

    Example 3:

    Input: nums = [1,1,1,2,2,2]
    Output: 5
    

    Example 4:

    Input: nums = [10,2,8,9,3,8,1,5,2,3,7,6]
    Output: 8

    Constraints:

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

    解题思路:从头开始遍历nums,很容易可以求出0~i区间内每个数字出现的次数,并用dic_count存储,key为数字的值,而value为数字出现的次数。同时再用dic记录dic_count中每个次数出现的次数。例如 [1,1,1,2,2,2,3,3,3,4,4,4,5] 区间,dic_count = {1: 3, 2: 3, 3: 3, 4: 3, 5: 1},而dic = {1: 1, 3: 4} ,这里1:1表示在dic_count中出现1次的数字有1个,出现3次的数字有四个。很显然,要判断0~i区间是否删除一个元素后可以使得所有元素出现的次数一样,需要满足以下条件:

    1. 如果len(dic)为1,只要所有的元素都只出现一次,那么这个区间就是满足题目要求的;

    2. 如果len(dic)为2,需要满足有且仅有一个元素出现一次,表示可以删除掉这个元素。或者是有且仅有一个元素出现的次数是其他元素出现的次数+1,表示删除掉这个元素后就使得其和其他元素出现次数一致。

    代码如下:

    class Solution(object):
        def maxEqualFreq(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            res = 0
            dic_count = {}
            dic = {}
            for i in range(len(nums)):
                if nums[i] in dic_count:
                    dic_count[nums[i]] += 1
                    count = dic_count[nums[i]]
                    dic[count] = dic.setdefault(count, 0) + 1
                    if count > 1 and count - 1 in dic:
                        dic[count - 1] -= 1
                        if dic[count - 1] == 0:
                            del dic[count - 1]
                else:
                    dic_count[nums[i]] = 1
                    count = dic_count[nums[i]]
                    dic[count] = dic.setdefault(count, 0) + 1
    
                if len(dic) == 2:
                    k1 = k2 = None
                    for key in dic.iterkeys():
                        if k1 == None:
                            k1 = key
                            continue
                        k2 = key
                    #if abs(k1-k2) == 1 and (dic[k1] == 1 or dic[k2] == 1):res = (i+1)
                    if (k1 - k2 == 1 and dic[k1] == 1) or (k2 - k1 == 1 and dic[k2] == 1):res = i+1
                    elif (k1 == dic[k1] == 1) or (k2 == 1 and dic[k2] == 1):res = i + 1
                elif len(dic) == 1:
                    # key is 1 : ex, input is [1,0]
                    if 1 in dic and dic[1] > 0:res = i+1
                    else:
                        for val in dic.itervalues():
                            if val == 1:res = i+1
            return res
  • 相关阅读:
    python+matplotlib制作雷达图3例分析和pandas读取csv操作
    python+pygame的导弹追踪鼠标游戏设置和说明
    python+pygame制作一个可自定义的动态时钟和详解
    python+tkinter制作一个可自定义的动态时钟及详细解释,珍藏版
    教你如何用python和pygame制作一个简单的贪食蛇游戏,可自定义
    博客园的博客之美化日历
    博客园的博客美化之-增加首页音乐播放器APlayer
    博客园的博客美化之文章推荐和反对按钮、看板娘、图片放大、github链接、返回顶部小火箭
    设计模式之装饰器模式
    设计模式之状态模式
  • 原文地址:https://www.cnblogs.com/seyjs/p/11684180.html
Copyright © 2020-2023  润新知