class Solution {
public:
/*不知道你们怎么解的,我一看这个就是经典滑动窗口,写完了但是耗时太多了,而且内存*/
/* 消耗也多*/
/*肯定有更好的方法,但是可以互相学习下,欢迎交流*/
/*本题解函数*/
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> result;//储存结果
vector<int> windows;//滑动窗口
int len = num.size();int left = -1;//左终止指针
vector<int>::iterator it;
if(len <= 0 || size <= 0){
return result;
}else{
//枚举start指针
for(int i = 0;i<len;i++){
//start进一个vector容器删除一个
if(i!=0){
it = find(windows.begin(),windows.end(),num[i-1]);
if(it != windows.end()){
windows.erase(it,it+1);
}
}
//给滑动窗口插入值,每次只插入到start+size处
while(left+1<i+size && left+1 < len){
windows.push_back(num[left+1]);
left++;
}int maxelement = *max_element(windows.begin(),
windows.end());
//将结果返回给result
if(windows.size()==size){
result.push_back(maxelement);
}
}
}
return result;
}
/************下面是无关紧要的函数,想学习的可以看,都是与此题相关的经典的问题*************/
/**************************************************************************/
/* 1.最长无重复子序列长度
* 2.最长递增子序列
* 3.最长无重复子序列
*/
/*此方法用来返回最长无重复连续子序列的长度,不能返回具体的子序列*/
/*动态规划*/
int maxLenArray(vector<int> num){
unordered_set<int> windows;
int left = -1;int right = num.size();int ans = 0;
for(int i = 0;i<right;i++){
if(i!=0){
windows.erase(num[i-1]);
}while(left+1<right && !windows.count(num[left+1])){
windows.insert(num[left+1]);left++;
}
ans = max(ans,(int)windows.size());
}
return ans;
}
/*此方法用来返回最长递增子序列(可以不连续) ,和最长值*/
/*贪心*/
vector<int> maxArray(vector<int> num){
vector<int> result;vector<int> maxlen;
if(num.size()<= 0){
return result;
}else{
int len = num.size();result.push_back(num[0]);
for(int i = 1;i<len;i++){
if(num[i] >= result.back()){
result.emplace_back(num[i]);
maxlen.push_back(result.size());
}else{
int post = lower_bound(result.begin(),
result.end(),num[i]) - result.begin();
result[post] = num[i];
maxlen.push_back(post+1);
}
}//最大长度
int index = *max_element(result.begin(), result.end());
for(int i = len-1;i>=0;i--){
if(maxlen[i] == index){
result[--index]= num[i];
}
}
return result;
}
}
/*此方法用来返回最长无重复子序列*/
/*vector滑动窗口*/
vector<int> maxNocopy(vector<int> arr){
vector<int> result;vector<int> results;
int left = -1;int maxlen = 0;int right = arr.size();
vector<int>::iterator it;vector<int>::iterator it1;
for(int i = 0;i<right;i++){
if( i!= 0){
it = find(result.begin(),result.end(),arr[i-1]);
if(it != result.end()){
result.erase(it,it+1);
}
}
while(left+1 < right ){
it1 = find(result.begin(),result.end(),arr[left+1]);
if(it1 == result.end()){
result.push_back(arr[left+1]);
left++;
}else{
break;
}
}if(result.size() > maxlen){
maxlen = result.size();
results = vector<int> (maxlen,0);
for(int i = 0;i<maxlen;i++){
results[i] = result[i];
}
}
}
return results;
}
};