zoukankan      html  css  js  c++  java
  • 最_长_连_续_子_串---- 乘--积

    输入一个数值序列numbers,输出某一个连续子串长度,满足小于给定乘积上限k。

    这里有两种解法,其一为O(N^2),其二基本为O(N)

     1 #include<iostream>
     2 #include <stdio.h>
     3 #include<algorithm>
     4 #include<vector>
     5 #include<map>
     6 
     7 using namespace std;
     8 
     9 long getSubArray(vector<int> &numbers, int k)
    10 {
    11     long count = 0;
    12     for (int i = 0; i < numbers.size();++i) {
    13         long mul = numbers[i];
    14         if (mul <= k) {
    15             count++;
    16             for (int j = i+1; j < numbers.size();++j) {
    17                 mul *= numbers[j];
    18                 if (mul <= k) {
    19                     count++;
    20                 }
    21                 else{
    22                     break;
    23                 }
    24             }
    25         }    
    26     }
    27     return count; 
    28 }
    29 
    30 long getSubArray2(vector<int> &numbers, int k)
    31 {
    32     vector<int> loc(numbers.size(), 0);
    33     vector<long> muls(numbers.size(), 0);
    34     int i = 0;
    35     int mul = numbers[i];
    36     if (mul <= k) {
    37         int j = i + 1;
    38         for (;j < numbers.size();++j) {
    39             mul *= numbers[j];
    40             if (mul > k) {
    41                 break;
    42             }
    43         }
    44         loc[i] = j;
    45         muls[i] = mul;
    46     }
    47     else
    48     {
    49         loc[i] = i;
    50         muls[i] = numbers[i];
    51     }
    52 
    53     for (int i = 1;i < numbers.size();++i) {
    54         int mul = muls[i-1]/(numbers[i-1]);
    55         if (mul <= k) {
    56             int j = loc[i-1] + 1;
    57             for (; j < numbers.size(); j++){
    58                 mul *= numbers[j];
    59                 if (mul > k) {
    60                     break;
    61                 }
    62             }
    63             loc[i] = j;
    64             muls[i] = mul;
    65         }
    66         else{
    67             loc[i] = loc[i - 1] > i ? loc[i - 1] : i;
    68             muls[i] = mul;
    69         }
    70     }
    71 
    72     long count = 0;
    73     for (int i = 0; i < numbers.size();++i) {
    74         count += loc[i] - i;
    75     }
    76     return count;
    77 }
    78 
    79 
    80 int main()
    81 {
    82     cout << "hello, world!" << endl;
    83     int i = 5, j = 2;
    84     int k=i<<j;
    85     printf("%d %d 
    ", 0xff , k);
    86     printf("%d %d 
    ", i << j, j >> i);
    87 
    88     vector<int> arr = {2,34,11,1,2,3,4,5,6,65,33,1,1,23,2,4,2,123,24,12,2,22};
    89     int m = 20;
    90     int count = getSubArray(arr, m);
    91     int count2 = getSubArray2(arr, m);
    92     cout << count <<"  "<<count2<< endl;
    93     system("pause");
    94     return 0; 
    95 }
  • 相关阅读:
    帮忙看看怎么优化这个最长的sql
    12种不宜使用的Javascript语法
    走格子
    乘法逆元
    完美字符串
    全排列问题
    A. Sorting Railway Cars
    Prim
    矩阵取数
    套题T8&T9
  • 原文地址:https://www.cnblogs.com/cofludy/p/11440247.html
Copyright © 2011-2022 走看看