【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

 

上一篇:453. Minimum Moves to Equal Array Elements


下一篇:【HDOJ6595】Everything Is Generated In Equal Probability(期望DP)