此逻辑适用于大多数测试用例,但不是全部。我在做什么错了?
def arrayManipulation(n, queries, m):
li = []
for j in range(0, m):
p = queries[j][0]
r = queries[j][1]
v = queries[j][2]
lo = []
for i in range(0, n):
lo.append(0)
for i in range(p - 1, r):
lo[i] = lo[i] + v
li.append(lo)
for i in range(1, m):
for j in range(0, n):
li[i][j] = li[i-1][j] + li[i][j]
return max(max(li))
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
nm = input().split()
n = int(nm[0])
m = int(nm[1])
queries = []
for _ in range(m):
queries.append(list(map(int, input().rstrip().split())))
result = arrayManipulation(n, queries,m)
print(result)
fptr.write(str(result) + '\n')
fptr.close()
答案 0 :(得分:0)
由于没有必要,没有python样本将m
传递给arrayManipulation
-在python中,您可以遍历列表而不是列表的索引:
您正在使这种方式变得比所需的更加复杂,您无需保留先前的列表就可以更新一个列表,例如:
def arrayManipulation(n, queries):
arr = [0]*n
for a, b, k in queries:
for i in range(a-1, b):
arr[i] += k
return max(arr)
答案 1 :(得分:0)
您使用了太多的for循环,可以很快将其减少到只有两个。
使用的方法可以是:
同时定义maximum_int_value = 0
和current_int_value = 0
。首先将用于将整数最大值存储在完成的数组中,并使用current_int_value存储当前最大值。
第一个for的开头部分可以用诸如li = [0] * n + 1
之类的东西代替。
仅使用两个循环-一个循环用于计算数组的第一步和最后一步,另一个循环用于获取最大的int值。
计算每一步或落入数组的总和。
如果maximum_int_value的值小于current_int_value,则maximum_int_value将为current_int_value。
全部
#!/bin/python3
import math
import os
import random
import re
import sys
# Complete the arrayManipulation function below.
def arrayManipulation(n, queries):
maximum_int_value = 0
current_int_value = 0
li = [0] * n
for query in queries:
li[query[0] - 1] += query[2]
# edge case taken from here - https://sites.northwestern.edu/acids/2018/11/12/solution-hackerrank-array-manipulation/
if query[1] != len(li):
li[query[1]] -= query[2]
for i in range(len(li)):
current_int_value += li[i]
if maximum_int_value < current_int_value :
maximum_int_value = current_int_value
return maximum_int_value
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
nm = input().split()
n = int(nm[0])
m = int(nm[1])
queries = []
for _ in range(m):
queries.append(list(map(int, input().rstrip().split())))
result = arrayManipulation(n, queries)
fptr.write(str(result) + '\n')
fptr.close()
将通过HackerRank中的所有当前16个测试用例
答案 2 :(得分:0)
def arrayManipulation(arr):
check = []
for i in range(len(arr)):
check.append(arr[i][1])
big_jug = max(check) + 1
temps = []
for i in range(len(arr)):
temps = [[0] * big_jug for _ in range(len(arr))]
for i in range(len(temps)):
for j in range(arr[i][0], arr[i][1] + 1):
temps[i][j] = arr[i][2]
sums = list(map(sum, zip(*temps)))
print(max(sums))
首先,检查所有低端(即每个数组,数组的第二个值)以获得最大值,以创建一个嵌套数组,其中所有值均为零。 然后将所有零值替换为所有查询(主给定数组)中所述的上端和下端,并放置数组第三个值 总和所有嵌套列表 最后找到最终列表的最高值
答案 3 :(得分:0)
在此循环中,我们使用的是列表中的变量insted,这是由于列表比变量占用更多的空间。因此,请尝试使用变量
def arrayManipulation(n, queries):
arr = [0]*n
for i in queries:
arr[i[0] - 1] += i[2]
if i[1] != len(arr):
arr[i[1]] -= i[2]
k = 0
p = 0
print(arr)
for q in arr:
p += q
if p > k:
k = p
return k