P4.4 MaxCounters
Calculate the values of counters after applying all alternating operations: increase counter by 1; set value of all counters to current maximum.
- P4.4 最大计数器
所有运算完成后计算计数器的值。运算包括计数器加一以及所有计数器均设置为最大值
有N个计数器,最初设置为0,并且有两个运算:
1. 增加(X):计数器X增加1;
2. 最大计数器:所有的计数器均设置为N个计数器中的最大值;
给定一个M个整数组成的非空数组A。此数组表示连续操作:
如果A[k]=X,并且1≤X≤N,则执行运算增加(X);
如果A[k]=N+1,则执行运算最大计数器。
例如,给定整数N=5,数组A:A[0]=3,A[1]=4,A[2]=4,A[3]=6,A[4]=1,A[5]=4,A[6]=4,每次连续操作后的计数器值为:
A[0]=3 ----->(0, 0, 1, 0, 0)
A[1]=4 ----->(0, 0, 1, 1, 0)
A[2]=4 ----->(0, 0, 1, 2, 0)
A[3]=6 ----->(2, 2, 2, 2, 2)
A[4]=1 ----->(3, 2, 2, 2, 2)
A[5]=4 ----->(3, 2, 2, 3, 2)
A[6]=4 ----->(3, 2, 2, 4, 2)
在所有操作之后给出每个计数器的值。
编写函数:
def solution(N, A)
给定一个整数N和一个由M个整数组成的非空数组A,返回一个表示计数器值的整数序列。
例如,针对上面的例子,函数应返回[3,2,2,4,2]。
假定:
- N和M是区间[1,100000]内的整数;
- 数组A的每个元素都是区间[1,N+1]内的整数。
- 解题思路
计算每两个最大计数器运算之间出现的最大次数,然后再加上最后一次最大数运算至数组结尾各个元素出现的次数。 - Python3代码
# -*- coding:utf-8 -*-
# &Author AnFany
# Lesson 4:Counting Elements
# P 4.4 MaxCounters
def solution_direct(N, A):
"""
按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N*M)
:param N: 计数器的个数
:param A: 数组
:return: 计数器值序列
"""
counters_list = [0] * N
for i in A:
if i == N + 1:
counters_list = [max(counters_list)] * N
else:
counters_list[i-1] += 1
return counters_list
def solution_bad(N, A):
"""
按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N*M)
:param N: 计数器的个数
:param A: 数组
:return: 计数器值序列
"""
sum_max = 0
element_counter = {j: 0 for j in range(N)}
for index, value in enumerate(A):
if value != N+1:
if value-1 in element_counter:
element_counter[value-1] += 1
else:
element_counter[value-1] = 1
else:
sum_max += max(element_counter.items(), key=lambda x: x[1])[1]
element_counter = {j: 0 for j in range(N)}
return [element_counter[j]+sum_max if j in element_counter else sum_max for j in range(N)]
def solution(N, A):
"""
按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N+M)
:param N: 计数器的个数
:param A: 数组
:return: 计数器值序列
"""
sum_max = 0
element_counter = {}
for index, value in enumerate(A):
if value != N+1:
if value-1 in element_counter:
element_counter[value-1] += 1
else:
element_counter[value-1] = 1
else:
try:
sum_max += max(element_counter.items(), key=lambda x: x[1])[1]
except ValueError:
sum_max += 0
element_counter = {}
return [element_counter[j]+sum_max if j in element_counter else sum_max for j in range(N)]
- 结果
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。