• 【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
  • 相关阅读:
    让DBGrid不能插入记录
    利用Stream下载文件
    设置文本框只能输入数字
    正则表达式的使用
    在同一页面处理提交代码
    HTML集合属性的应用
    移动MAS短信API libmySQL.dll无法添加引用
    ArcServer for Silverlight系列之属性查询
    aspnet_wp.exe w3wp.exe
    更改嵌入互操作类型 无法从程序集**中嵌入互操作类型,因为该程序集缺少“ImportedFromTypeLibAttribute”特性或“PrimaryInteropAssemblyAttribute“特性
  • 原文地址:https://www.cnblogs.com/seyjs/p/11684180.html
Copyright © 2020-2023  润新知