lesson 5: prefix sums

  1. PassingCars

Count the number of passing cars on the road.

A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of array A represent consecutive cars on a road.

Array A contains only 0s and/or 1s:

0 represents a car traveling east,

1 represents a car traveling west.

The goal is to count passing cars. We say that a pair of cars (P, Q), where 0 ≤ P < Q < N, is passing when P is traveling to the east and Q is traveling to the west.

For example, consider array A such that:

  A[0] = 0
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1

We have five pairs of passing cars: (0, 1), (0, 3), (0, 4), (2, 3), (2, 4).

Assume that:

  • N is an integer within the range [1..100,000];
  • each element of array A is an integer that can have one of the following values: 0, 1.

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(1),

思路:

  • 可以计算suffix sum的方式

  • 然后,从前面开始遍历list,遇到a = 0,result即加上当前的suffix sum的值

  • 此题元素是0,1,故可以不用保留每一步的计算,题目有要求限制O(1)的space, 也是给出提示,用一个变量retsum值来记录,每一步的prefix sum值,每移动一步,元素是1的话,将retsum 减1, 即是下一个prefix sum 值。

  • Detected time complexity: O(N)

  • [100%]

def solution(A):
# write your code in Python 2.7
result = 0
retsum = sum(A)
for a in A:
if a == 0:
result += retsum
if result > 1000000000:
return -1
else:
retsum -= 1
return result

2. CountDiv

Compute number of integers divisible by k in range [a..b].

given three integers A, B and K, returns the number of integers within the range [A..B] that are divisible by K, i.e.:

{ i : A ≤ i ≤ B, i mod K = 0 }

For example, for A = 6, B = 11 and K = 2, your function should return 3, because there are three numbers divisible by 2 within the range [6..11], namely 6, 8 and 10.

Assume that:

  • A and B are integers within the range [0..2,000,000,000];
  • K is an integer within the range [1..2,000,000,000];

    A ≤ B.

Complexity:

  • expected worst-case time complexity is O(1);
  • expected worst-case space complexity is O(1).

CountDiv solution 1

  • Test score 100%
def solution(A, B, K):
# write your code in Python 2.7
ra = -1 if A == 0 else (A - 1)/K
rb = B/K return rb -ra

solution 2

  • Test score 100%
def solution(A, B, K):
# write your code in Python 2.7
c = 1 if A%K == 0 else 0
return B/K -A/K + c
def solution(A, B, K):
# write your code in Python 2.7
return (B/K - A/K) if (A%K != 0 ) else (B/K - A/K + 1)

3. GenomicRangeQuery

Find the minimal nucleotide from a range of sequence DNA.

A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which correspond to the types of successive nucleotides in the sequence. Each nucleotide has an impact factor, which is an integer. Nucleotides of types A, C, G and T have impact factors of 1, 2, 3 and 4, respectively. You are going to answer several queries of the form: What is the minimal impact factor of nucleotides contained in a particular part of the given DNA sequence?

The DNA sequence is given as a non-empty string S = S[0]S[1]...S[N-1] consisting of N characters. There are M queries, which are given in non-empty arrays P and Q, each consisting of M integers. The K-th query (0 ≤ K < M) requires you to find the minimal impact factor of nucleotides contained in the DNA sequence between positions P[K] and Q[K](inclusive).

For example, consider string S = CAGCCTA and arrays P, Q such that:

P[0] = 2    Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6

The answers to these M = 3 queries are as follows:

  • The part of the DNA between positions 2 and 4 contains nucleotides G and C (twice), whose impact factors are 3 and 2 respectively, so the answer is 2.
  • The part between positions 5 and 5 contains a single nucleotide T, whose impact factor is 4, so the answer is 4.
  • The part between positions 0 and 6 (the whole string) contains all nucleotides, in particular nucleotide A whose impact factor is 1, so the answer is 1.

the function should return the values [2, 4, 1], as explained above.

Assume that:

  • N is an integer within the range [1..100,000];
  • M is an integer within the range [1..50,000];
  • each element of arrays P, Q is an integer within the range [0..N − 1];
  • P[K] ≤ Q[K], where 0 ≤ K < M;
  • string S consists only of upper-case English letters A, C, G, T.

Complexity:

  • expected worst-case time complexity is O(N+M);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

解法一:

  • Test score 62%
  • Detected time complexity:

    O(N * M)
  • 最初的想法是:根据给出的范围,用set保存,看是否有各元素
  • 时间复杂度,明显达不到O(N+M)
def getMinFactor(S,l,i,j):
if j == (l-1):
tmp = set(S[i:]) #
else:
tmp = set(S[i:(j+1)])
if 'A' in tmp:
return 1
elif 'C' in tmp:
return 2
elif 'G' in tmp:
return 3
else:
return 4 def solution(S, P, Q):
# write your code in Python 2.7
length = len(S)
result = []
for x,y in zip(P,Q):
#print x,y
result.append(getMinFactor(S,length,x,y))
return result

解法二:

  • Test score 100%
  • used each list to save that states whether has element or not
  • 在用prefix sum 做差的方式,依次检查是否存在A,C,G,T字符
  • 注意数值关系
def calcPrefixSum(S):
l = len(S)+1
pa,pc,pg = [0]*l,[0]*l,[0]*l
for idx,elem in enumerate(S):
a,c,g = 0,0,0
if elem == 'A':
a = 1
elif elem == 'C':
c = 1
elif elem == 'G':
g = 1
pa[idx+1] = pa[idx] + a
pc[idx+1] = pc[idx] + c
pg[idx+1] = pg[idx] + g
return pa,pc,pg def solution(S, P, Q):
# write your code in Python 2.7
pA,pC,pG = calcPrefixSum(S)
result = []
for i,j in zip(P,Q):
if pA[j+1] - pA[i] > 0:
ret = 1
elif pC[j+1] - pC[i] > 0:
ret = 2
elif pG[j+1] - pG[i] > 0:
ret = 3
else:
ret = 4
result.append(ret)
return result
根据prefix sum list:
pA = [0, 0, 1, 1, 1, 1, 1, 2]
pC = [0, 1, 1, 1, 2, 3, 3, 3]
pG = [0, 0, 0, 1, 1, 1, 1, 1] 故,是下标[j+1]-[i]

4. MinAvgTwoSlice

Find the minimal average of any slice containing at least two elements.

A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q), such that 0 ≤ P < Q < N, is called a slice of array A (notice that the slice contains at least two elements). The average of a slice (P, Q) is the sum of A[P] + A[P + 1] + ... + A[Q] divided by the length of the slice. To be precise, the average equals (A[P] + A[P + 1] + ... + A[Q]) / (Q − P + 1).

For example, array A such that:

A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8

contains the following example slices:

  • slice (1, 2), whose average is (2 + 2) / 2 = 2;
  • slice (3, 4), whose average is (5 + 1) / 2 = 3;
  • slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.

The goal is to find the starting position of a slice whose average is minimal.

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(N),

sloution

  • Test score 100%

note: transfer to 2/3 ,

  • 只要查看相邻两个和三个的数的平均值即可
  • proof
def solution(A):
# write your code in Python 2.7
length = len(A)
minStartPos = 0
minSum = (A[0] + A[1])/2.0 for i in xrange(length - 2):
tmp = (A[i] + A[i+1])/2.0
if tmp < minSum:
minSum = tmp
minStartPos = i
tmp = (tmp*2 + A[i+2])/3.0
if tmp < minSum:
minSum = tmp
minStartPos = i
if (A[-1] + A[-2])/2.0 < minSum:
minStartPos = length - 2 return minStartPos

prefix sums--codility的更多相关文章

  1. 【题解】【数组】【Prefix Sums】【Codility】Genomic Range Query

    A non-empty zero-indexed string S is given. String S consists of N characters from the set of upper- ...

  2. 【题解】【数组】【Prefix Sums】【Codility】Passing Cars

    A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of arra ...

  3. Codeforces 837F Prefix Sums

    Prefix Sums 在 n >= 4时候直接暴力. n <= 4的时候二分加矩阵快速幂去check #include<bits/stdc++.h> #define LL l ...

  4. CodeForces 837F - Prefix Sums | Educational Codeforces Round 26

    按tutorial打的我血崩,死活挂第四组- - 思路来自FXXL /* CodeForces 837F - Prefix Sums [ 二分,组合数 ] | Educational Codeforc ...

  5. Educational Codeforces Round 26 [ D. Round Subset ] [ E. Vasya's Function ] [ F. Prefix Sums ]

    PROBLEM D - Round Subset 题 OvO http://codeforces.com/contest/837/problem/D 837D 解 DP, dp[i][j]代表已经选择 ...

  6. CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)

    传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...

  7. CF1303G Sum of Prefix Sums

    点分治+李超树 因为题目要求的是树上所有路径,所以用点分治维护 因为在点分治的过程中相当于将树上经过当前$root$的一条路径分成了两段 那么先考虑如何计算两个数组合并后的答案 记数组$a$,$b$, ...

  8. GenomicRangeQuery /codility/ preFix sums

    首先上题目: A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which ...

  9. codeforces:Prefix Sums分析和实现

    题目大意: 给出一个函数P,P接受一个数组A作为参数,并返回一个新的数组B,且B.length = A.length + 1,B[i] = SUM(A[0], ..., A[i]).有一个无穷数组序列 ...

  10. [CF1204E]Natasha,Sasha and the Prefix Sums 题解

    前言 本文中的排列指由n个1, m个-1构成的序列中的一种. 题目这么长不吐槽了,但是这确实是一道好题. 题解 DP题话不多说,直接状态/变量/转移. 状态 我们定义f表示"最大prefix ...

随机推荐

  1. python中format函数

    python中format函数用于字符串的格式化 通过关键字 1 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 2 grade = {'nam ...

  2. 2018-2019-1 20189215 《Linux内核原理与分析》第六周作业

    <庖丁解牛>第五章书本知识总结 system_call并不是一个普通的函数,只是一段汇编代码的起点,且内部没有严格遵守函数调用堆栈机制. 通过set_system_trap_gate函数绑 ...

  3. Xilinx SD controller

    Features supported by driver Zynq All the HW/IP features are supported by driver ZynqMP All the HW/I ...

  4. Coursera SDN M1.2.1 SDN History: Programmable Networks 1

    接上第二点 NOTE (2)active networks => Programmability in networks(1990s) Sturcture: What are active ne ...

  5. [BZOJ1877][SDOI2009]SuperGCD

    题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...

  6. Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")

    从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 例如: 配置文件: ...

  7. 使用属性动画 — Property Animation

    属性动画,就是通过控制对象中的属性值产生的动画.属性动画是目前最高级的2D动画系统. 在API Level 11中添加.Property Animation号称能控制一切对象的动画,包括可见的和不可见 ...

  8. vue项目打包部署到nginx 服务器上

    假如要实现的效果如下 http://ip/vue    =>是进入首页访问的路径是  usr/local/nginx/html/vue http://ip/website     =>是进 ...

  9. (GoRails)ActiveRecord --explain方法:(优化你的查询)

    https://gorails.com/episodes/activerecord-explain?autoplay=1 比如没有加index的查询和加了index的查询,调用数据库的速度就差5倍. ...

  10. Rails 5 Test Prescriptions 第9章 Testing-JavaScript: Integration Testing,❌挂一个问题webpacker::helper

    使用Capybara进行JS的集成测试 谈论驱动 让测试通过 Webpack in Development Mode Js设计 是用户在网页上有好的体验的重要因素. 尽管如此,许多网页不测试JS. 部 ...