阵列操作| Hackerrank运行时错误问题

时间:2018-09-16 19:16:00

标签: python arrays python-3.x

我正在从hackerrank进行此数组操作问题,它告诉我运行时错误。在我看来,时间复杂度为O(n)。但是它仍然有这个问题。有人可以帮我吗?

下面是link

  

从1索引的零数组和一个操作列表开始,对于每个操作,在两个给定索引(含两个)之间为每个数组元素添加一个值。完成所有操作后,返回数组中的最大值。

     

例如,零数组的长度。您的查询列表如下:

a b k
1 5 3
4 8 7
6 9 1
     

在索引之间(包括两个端点)添加值:

index -> 1 2 3  4  5 6 7 8 9 10
        [0,0,0, 0, 0,0,0,0,0, 0]
        [3,3,3, 3, 3,0,0,0,0, 0]
        [3,3,3,10,10,7,7,7,0, 0]
        [3,3,3,10,10,8,8,8,1, 0]
     

最大值是在执行所有操作之后。

我在这里附加了我的代码:

def arrayManipulation(n,queries):
    increment=[]
    value=[]
    for i in range(n):
        increment+=[0]
        value+=[0]
    for j in range(m):
        left=queries[j][0]
        right=queries[j][1]
        k=queries[j][2]
        increment[left-1]+=k
        if right>=n:
            continue
        else:
            increment[right]-=k
    value[0]=increment[0]
    for i in range(1,n):
        value[i]=value[i-1]+increment[i]
    maximum=max(value)
    return maximum

enter image description here

2 个答案:

答案 0 :(得分:4)

如果只是在正确的索引处进行加/减操作,则可以简化此问题-因此您只有2个操作,而不是2000个操作

1 2000 3 

您的查询列表如下:

a b k
1 5 3
4 8 7
6 9 1


# demonstation purposes, do not create list with 200k zero entries - use a dict. see below.
[+3, 0, 0,  0, -3,  0, 0,  0, 0, 0]     # 2 index ops by 1 5 3
[+3, 0, 0, +7, -3,  0, 0, -7, 0, 0]      # 2 index ops by 4 8 7
[+3, 0, 0, +7, -3, +1, 0, -7,-1, 0]     # 2 index ops by 6 9 1

# sums:
  3  3  3  10   7   8  8   1  0  0  # for loop through list, adding all, remembering max

您只需遍历整个列表即可获得最大价值,只需将所有数字加起来并在传递过程中记住最大价值即可。

这简化了巨大列表的整个问题,破坏了您的内存/计算时间。

而不是这样做(对于200k长的列表)

 1 2000 3  # 2000 times change value
11 2000 3  # 2000 times change value
21 2000 3  # 2000 times change value 
31 2000 3  # 2000 times change value
41 2000 3  # 2000 times change value

您进行10次值更改:

# demonstation purposes, do not create list with 200k zero entries - use a dict. see below.
[ ..., +3, ..., +3, ..., +3, ..., +3, ..., +3, ............, 
       -3, ..., -3, ..., -3, ..., -3, ..., -3, ...] 

{1:3, 11:3, 21:3, 31:3, 41:3, 2001:-3, 2011:-3, 2021:-3, 2031:-3, 2041:-3}

,并在按键排序并添加值时得到:

 3, 6, 9, 12, 15, 18, 15, 13, 12, 9, 6, 3 

您应该能够将这些东西插入键==位置的字典中(如果它多次出现,请确保更新键的值而不是替换键:

3 7 3
3 9 3
3 5 3

{3:9,7:-3, 9:-3, 5:-3} # 3 updated several times 

弄清楚这些想法是使某些hackerrank有趣的原因(虽然很多都是不好的/不清楚的)。

这是代码,很有趣-复制和粘贴解决方案并不是什么成就-这就是为什么我没有首先编写代码的原因...

maxElem, inputs = [int(n) for n in input().split(" ")]
d = {}
for _ in range(inputs):
    x, y, incr = [int(n) for n in input().split(" ")]
    d.setdefault(x,0)
    d[x]=d[x]+incr 
    if(y <= maxElem+2):
        d.setdefault(y+1,0)
        d[y+1]=d[y+1]-incr

maxx = 0
x= 0 

for i in sorted(d): 
    x+=d[i]
    if(maxx<x): 
        maxx=x

print(maxx)

答案 1 :(得分:0)

导入java.io。*;

import java.math。*;

导入java.security。; 导入java.text。;

导入java.util。*;

导入java.util.concurrent。*;

导入java.util.regex。*;

公共类解决方案{

// Complete the arrayManipulation function below.
static void findMax(int n, int a[],int b[], int k[], int m)

{ int [] arr = new int [n];

// Start performing m operations
for(int i = 0; i < m; i++)
{
    // Store lower and upper index i.e. range
    int lowerbound = a[i];
    int upperbound = b[i];

    // Add 'k[i]' value at this operation to
    // whole range
    for(int j = lowerbound; j < upperbound; j++)
       arr[j]=arr[j]+k[i];
        
}

// Find maximum value after all 
// operations and return
int res = Integer.MIN_VALUE;
for(int i = 0; i < n; i++)
    res = Math.max(res, arr[i]);


    System.out.println(res);
}



public static void main(String[] args)  {
    Scanner scan = new Scanner(System.in);
    int n=scan.nextInt();
    int m=scan.nextInt();
    int a[]=new int[3];
    int b[]=new int[3];
    int k[]=new int[3];

    for(int i=0;i<a.length;i++)
    {
        a[i]=scan.nextInt();
        b[i]=scan.nextInt();
        k[i]=scan.nextInt();
    }
    findMax(n,a,b,k,m);
}

}