zoukankan      html  css  js  c++  java
  • 【题解】【数组】【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-case English letters A, C, G, T.

    This string actually represents a DNA sequence, and the upper-case letters represent single nucleotides(核苷).

    You are also given non-empty zero-indexed arrays P and Q consisting of M integers. These arrays represent queries about minimal nucleotides. We represent the letters of string S as integers 1, 2, 3, 4 in arrays P and Q, where A = 1, C = 2, G = 3, T = 4, and we assume that A < C < G < T.

    Query K requires you to find the minimal nucleotide from the range (P[K], Q[K]), 0 ≤ P[i] ≤ Q[i] < N.

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

     

     P[0] = 0 Q[0] = 8 P[1] = 0 Q[1] = 2 P[2] = 4 Q[2] = 5 P[3] = 7 Q[3] = 7

     

    The minimal nucleotides from these ranges are as follows:

    • (0, 8) is A identified by 1,
    • (0, 2) is A identified by 1,
    • (4, 5) is C identified by 2,
    • (7, 7) is T identified by 4. 

    the function should return the values [1, 1, 2, 4], 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 array P, Q is an integer within the range [0..N − 1];
    • P[i] ≤ Q[i];
    • 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).

    Elements of input arrays can be modified.

     

    思路:

    开四个Prefix Sums数组分别用来统计ACGT从m到n的个数,如果A个数为0就看C,如此类推。

    如果不是事先知道这题应该用Prefix Sums,可能没那么容易想到。

    代码:

     1 vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {
     2     int n = S.length();
     3     vector<vector<int> > vACGT(4, vector<int>(1,0));
     4     int count[4] = {0,0,0,0};
     5     for(int i = 0; i < n; i++){
     6         switch(S[i]){
     7         case 'A':
     8             count[0] += 1;
     9             break;
    10         case 'C':
    11             count[1] += 1;
    12             break;
    13         case 'G':
    14             count[2] += 1;
    15             break;
    16         case 'T':
    17             count[3] += 1;
    18             break;
    19         }
    20         for(int k = 0; k < 4; k++){
    21             vACGT[k].push_back(count[k]);
    22         }
    23     }
    24     
    25     vector<int> vres;
    26     for(int i = 0; i < P.size(); i++){
    27         for(int k = 0; k < 4; k++){
    28             if(vACGT[k][Q[i]+1]-vACGT[k][P[i]] > 0){
    29                 vres.push_back(k+1);
    30                 break;
    31             }
    32         }
    33     }
    34     return vres;
    35 }
  • 相关阅读:
    简单工厂模式
    工厂方法模式
    Linq对DatatTable进行分组统计
    微软现在支持某一路径下?占位符的文件扫描
    Spring MVC中InternalResourceViewResolver视图解析器的默认行为
    什么是 HandlerMethod ?
    03基于NIO的聊天室案例
    01基于BIO的多人聊天室
    02基于BIO的多线程客户端服务器通信案例
    java8新特性学习
  • 原文地址:https://www.cnblogs.com/wei-li/p/GenomicRangeQuery.html
Copyright © 2011-2022 走看看