本系列将探讨算法的优化。
 时间复杂度对算法的选择

 时间优化
 思维的改进
LCP08.剧情触发时间
最开始的想法同时考虑三个属性,每到新的一天就遍历requirements数组,看能否有剧情出发,果不其然超时了,最后两个样例没通过
之后进行改进。
首先如果只考虑一种属性,显然我们只需要计算每一天的属性情况,最后对于所有的requirements 都在属性列表中进行二分查找(现在只有一种属性了),就能知道他是在哪一天完成的了。
但这道题实际上,每一种属性的满足是互相独立的。
简单来说,对于一个剧情要求 (C, R, H) 来说,假设 C 要求是在第 x 天满足的,R要求是在第 y 天满足的,H 要求是在第 z 天满足的。那么该剧情的满足时间为:
t=max(x,y,z)
原始代码:
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;     } };
  | 
 
改进代码:
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) { 		 		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(); 		for (int i = 0; i < requirements.size(); i++) 		{ 			 			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 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;     } };
   | 
 
判断是否包括元音字母?
最原始思路
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)
  | 
 
哈希表:
1 2 3
   | unordered_set<char>S({'a','e','i','o','u'}); S.count(c);
 
  | 
 
参考资料:
https://www.acwing.com/blog/content/32/