zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    java 反射 invoke()的异常问题记录
    windows安装nginx可视化工具nginxWebUI
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(三)(添加增删改查)
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(二)(添加日志打印和源码地址)
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(一)
    mac + docker+单击clickhouse+Dbeaver安装全套
    线程中使用for循环的add或remove方法的两种方案
    map数据按照list排序
    oracle dbca 【bug】:JAVA_JIT_ENABLED=false
    Ubuntu(Debian):apt-get:处理repository数字签名无效、过期、没有签名:即 如何强制 apt-get update?
  • 原文地址:https://www.cnblogs.com/seyjs/p/11684180.html
Copyright © 2011-2022 走看看