code题目链接:https://leetcode.cn/problems/maximum-equal-frequency/submissions/
思路
- python中 Counter( )为计数函数,广泛应用于数组
- count为记录x的个数
- freqCount 为记录次数为 f 数字的个数
- freqCount[x] * x 即为 此频次出现的个数
- 以例子为出发点,区分3种不同的情况
class Solution:
def maxEqualFreq(self, nums) -> int:
# count 记录x的个数, freqCount 记录出现次数为f数的数目
count, freqCount = Counter(), Counter()
maxFeq = ans = 0
for i, num in enumerate(nums):
# 如果这个数存在
if count[num]:
# 这个出现次为f的频次需要减1,出现为f+1的频次需要加1
freqCount[ count[num] ] -= 1
count[num] += 1
# count[num] 加1了,freqCount[count[num]] 的频次需要随之变
freqCount[ count[num] ] += 1
# 数字x 最大频次需要更新
maxFeq = max(maxFeq, count[num])
# 会有以下三种情况
# 1.如果最大频次均为1,则最大长度为 i+1, i从0开始,因此需要 +1,例如[1,2,3,4,5]
if maxFeq == 1:
ans = max(ans, i+1)
# 2.最大频次 * 数量 = i, 例如[1,1,1,3]
if freqCount[maxFeq] * maxFeq == i:
ans = max(ans, i+1)
# 3. 次最大频次 * 数量 + 最大频次 * 数量 = i+1(全部数量), 最大频次 = 1, 例如 [1,1,1,2,2,3,3]
if freqCount[maxFeq] == 1 and freqCount[maxFeq] * maxFeq + freqCount[maxFeq-1] * (maxFeq-1) == i + 1:
ans = max(ans, i+1)
return ans
图片描述
acwing题目链接:https://www.acwing.com/solution/content/4628/
思想:
- 归并排序,步骤
- 直接将列表分为两半,使左右两半均有序
- 左右两半均有序后,有三个指针,3个数组,依次迭代
- 终止条件:当列表长度小于等于1时,即返回(否则会陷入到无限循环中)
n = int(input())
list1 = list(map(int, input().split()))
def merge(sequence):
if len(sequence) <= 1:
return
mid = len(sequence) // 2
# 左侧列表,右侧列表,左开右闭,python的优点
L = sequence[:mid]
R = sequence[mid:]
merge(L)
merge(R)
# 指针i,j, k
i = j = k = 0
for _ in range(len(sequence)):
if i < len(L) and j < len(R):
if L[i] <= R[j]:
sequence[k] = L[i]
i += 1
k += 1
else:
sequence[k] = R[j]
j += 1
k += 1
# 右边已经到头了
elif i < len(L) and j == len(R):
sequence[k] = L[i]
i += 1
k += 1
# 左边已经到头了
elif j < len(R) and i == len(L):
sequence[k] = R[j]
j += 1
k += 1
if __name__ == "__main__":
merge(list1)
for i in list1:
print(i, end=' ')
知识点:
- python列表取子列表为 [:mid] 左闭右开形,直接deep copy
- print(i, end =’ ')中的end参数,默认为换行,end是以想要的格式来替代