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实现 洛谷 P1009 阶乘之和
    Java实现 洛谷 P1009 阶乘之和
    mysql8.0 安装 修改密码 允许远程连接
    Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19
    优秀c++开源项目集合
    可能是国内最火的开源项目 —— C/C++ 篇
    CodeBlocks环境搭建及创建第一个C++程序
    手动安装MySQL8.0
    【Linux】CentOS 7.4 安装 MySQL 8.0.12 解压版
    CentOS7下安装mysql5.7
  • 原文地址:https://www.cnblogs.com/seyjs/p/11684180.html
Copyright © 2011-2022 走看看