697. Degree of an Array--Python

697. Degree of an Array

Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements.

Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the same degree as nums.

Example 1:

Input: [1, 2, 2, 3, 1]
Output: 2
Explanation: 
The input array has a degree of 2 because both elements 1 and 2 appear twice.
Of the subarrays that have the same degree:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
The shortest length is 2. So return 2.

Example 2:

Input: [1,2,2,3,1,4,2]
Output: 6

Note:

  • nums.length will be between 1 and 50,000.
  • nums[i] will be an integer between 0 and 49,999.

思路:
先找出nums列表中出现频率最高的元素HighKey(可能有多个),然后遍历这些值,找到它们的index的最大和最小,最后比较大小,输出最小的。

我的代码(结果正确,但效率低,所用时间太长,未被接受):

class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)>1:
            HighValue = nums.count(nums[0])
            HighKey = []
            for ele in nums[1:]:
                if ele in HighKey:
                    break
                else:
                    if nums.count(ele)>HighValue:
                        HighValue=nums.count(ele)
                        HighKey=[]
                        HighKey.append(ele)
                    if nums.count(ele)==HighValue:
                        if ele not in HighKey:
                            HighKey.append(ele)
            num_list=[]
            for each in HighKey:
                L=[i for i, v in enumerate(nums) if v == each]
                num=L[-1]-L[0]+1
                num_list.append(num)
            return min(num_list)
        else:
            return 1

提交代码(参考讨论区):

class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        from collections import Counter, defaultdict

        degree = max(Counter(nums).values())
        so_far = defaultdict(int)
        min_size = len(nums)
        start, end = 0, len(nums) - 1
        for end, num in enumerate(nums):
            so_far[num] += 1
            while start <= end and so_far[num] == degree:
                min_size = min(min_size, end - start + 1)
                so_far[nums[start]] -= 1
                start += 1
        return min_size

你可能感兴趣的:(leetcode)