最_长_连_续_子_串---- 乘--积

输入一个数值序列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 \n", 0xff , k);
86     printf("%d %d \n", 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 }

 

posted @ 2019-08-31 20:05  cofludy  阅读(213)  评论(0编辑  收藏  举报