prefix sums--codility
lesson 5: prefix sums
- 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的更多相关文章
- 【题解】【数组】【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- ...
- 【题解】【数组】【Prefix Sums】【Codility】Passing Cars
A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of arra ...
- Codeforces 837F Prefix Sums
Prefix Sums 在 n >= 4时候直接暴力. n <= 4的时候二分加矩阵快速幂去check #include<bits/stdc++.h> #define LL l ...
- CodeForces 837F - Prefix Sums | Educational Codeforces Round 26
按tutorial打的我血崩,死活挂第四组- - 思路来自FXXL /* CodeForces 837F - Prefix Sums [ 二分,组合数 ] | Educational Codeforc ...
- 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]代表已经选择 ...
- CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)
传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...
- CF1303G Sum of Prefix Sums
点分治+李超树 因为题目要求的是树上所有路径,所以用点分治维护 因为在点分治的过程中相当于将树上经过当前$root$的一条路径分成了两段 那么先考虑如何计算两个数组合并后的答案 记数组$a$,$b$, ...
- GenomicRangeQuery /codility/ preFix sums
首先上题目: A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which ...
- codeforces:Prefix Sums分析和实现
题目大意: 给出一个函数P,P接受一个数组A作为参数,并返回一个新的数组B,且B.length = A.length + 1,B[i] = SUM(A[0], ..., A[i]).有一个无穷数组序列 ...
- [CF1204E]Natasha,Sasha and the Prefix Sums 题解
前言 本文中的排列指由n个1, m个-1构成的序列中的一种. 题目这么长不吐槽了,但是这确实是一道好题. 题解 DP题话不多说,直接状态/变量/转移. 状态 我们定义f表示"最大prefix ...
随机推荐
- 解决[Xcodeproj] Unknown object version错误
错误描述: RuntimeError - [Xcodeproj] Unknown object version. /Library/Ruby/Gems/2.0.0/gems/xcodeproj-0.2 ...
- json反序列化快捷实体类
有时候我们反序列化一个json串只为了提取里面的数据,而且json串的层级结构可能会比较复杂,定义对应的实体类会多而杂,有时还不一定能达到想要的效果. 则可以关注下以下两个类: java : ...
- AI学习资料
OpenAI Gym介绍 http://m.blog.csdn.net/u010510350/article/details/71450232
- 模块的封装之C语言类的继承和派生
[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...
- Python学习札记(二十二) 函数式编程3 filter & SyntaxError: unexpected EOF while parsing
参考: filter Problem SyntaxError: unexpected EOF while parsing 遇到该语法错误,一般是由于 括号不匹配 问题. Note 1.filter 用 ...
- Solidity 官方文档中文版 1_简介
简介 Solidity是一种语法类似JavaScript的高级语言.它被设计成以编译的方式生成以太坊虚拟机代码.在后续内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...
- 在MyEclise中使用自己安装的tomcat
·将Tomcat配置到MyEclipse中 1.在MyEclipse中打开Window子选项Preferences: 2.在Preferences面板中,点击左边选项中的MyEclipse,找到Ser ...
- photoswipe图片滑动插件使用
第一步: 引入jss和css文件 <!-- Core CSS file --> <link rel="stylesheet" href="path/t ...
- mybatis generator为实体类生成自定义注释(读取数据库字段的注释添加到实体类,不修改源码)
我们都知道mybatis generator自动生成的注释没什么实际作用,而且还增加了代码量.如果能将注释从数据库中捞取到,不仅能很大程度上增加代码的可读性,而且减少了后期手动加注释的工作量. 1.首 ...
- MOBA游戏学会这些知识,你才算真的入门了!
<英魂之刃口袋版>是一个标准的MOBA游戏,MOBA指的是多人在线战术竞技游戏,游戏模式始于1998年<星际争霸>中的一张自定义地图,经过近20年的优化和调整逐渐演变成了我们现 ...