avatar

目录
算法优化

本系列将探讨算法的优化。

时间复杂度对算法的选择

时间优化

思维的改进

LCP08.剧情触发时间
最开始的想法同时考虑三个属性,每到新的一天就遍历requirements数组,看能否有剧情出发,果不其然超时了,最后两个样例没通过
之后进行改进。
首先如果只考虑一种属性,显然我们只需要计算每一天的属性情况,最后对于所有的requirements 都在属性列表中进行二分查找(现在只有一种属性了),就能知道他是在哪一天完成的了。
但这道题实际上,每一种属性的满足是互相独立的。
简单来说,对于一个剧情要求 (C, R, H) 来说,假设 C 要求是在第 x 天满足的,R要求是在第 y 天满足的,H 要求是在第 z 天满足的。那么该剧情的满足时间为:
t=max(x,y,z)

原始代码:

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
int res[3]={0};
int day=increase.size();
vector<int>end(requirements.size(),-1);
for(int i=0;i<day;i++){
for(int j=0;j<3;j++){
res[j]+=increase[i][j];
}
for(int m=0;m<requirements.size();m++){
if(end[m]!=-1)continue;
int count=0;
int count1=0;
for(int n=0;n<3;n++){
if(res[n]>=requirements[m][n])
count++;
if(requirements[m][n]==0)
count1++;
}
if(count1==3){
end[m]=0;
continue;
}
if(count==3)
end[m]=i+1;
}
}
return end;
}
};

改进代码:

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
//将三个属性分开,并初始化为0
vector<int> C(increase.size() + 1, 0);//初始化
vector<int> R(increase.size() + 1, 0);
vector<int> H(increase.size() + 1, 0);
for (int i = 0; i < increase.size(); ++i)//算和
{
C[i + 1] = C[i] + increase[i][0];
R[i + 1] = R[i] + increase[i][1];
H[i + 1] = H[i] + increase[i][2];
}
vector<int> ret;//返回值
int maxlen = C.size();//若lower_bound中没找到则返回last,此时求的差是数组长度
for (int i = 0; i < requirements.size(); i++)
{
//lower_bound 返回大于等于查找元素的位置
int lbc = lower_bound(C.begin(), C.end(), requirements[i][0]) - C.begin();
int lbr = lower_bound(R.begin(), R.end(), requirements[i][1]) - R.begin();
int lbh = lower_bound(H.begin(), H.end(), requirements[i][2]) - H.begin();
if (lbc == maxlen || lbr == maxlen || lbh == maxlen)//没触发
{
ret.emplace_back(-1);
}
else
{
ret.emplace_back(max(max(lbc, lbr), lbh));
}
}
return ret;
}
};

代码简洁优化

  1. 检查单词是否为句中其他单词的前缀
    使用字符串流
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
```
```c++
class Solution {
public:
int isPrefixOfWord(string sentence, string searchWord) {
stringstream ssin(sentence);
string word;
for(int i =1;ssin>>word;i++){
if(word.substr(0,searchWord.size())==searchWord)
return i;
}
return -1;
}
};

判断是否包括元音字母?
最原始思路

c++
1
2
3
4
5
6
7
8
9
int de(char c){
if(c=='a')return 1;
if(c=='e')return 1;
if(c=='i')return 1;
if(c=='o')return 1;
if(c=='u')return 1;
return 0;
}
de(c)

哈希表:

c++
1
2
3
unordered_set<char>S({'a','e','i','o','u'});
S.count(c);
//0就是不包含,1就是包含

参考资料:
https://www.acwing.com/blog/content/32/

文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/05/15/optimize/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论