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列表中出现频率最高的元素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