第三十三题 队列和栈第五题
方法一:暴力破解 直接在遍历每个窗口中所有的值 找最大值
class Solution {
public:vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> ret_ans;
// 直接暴力运算 每次找最大值保存进去
if(num.size()<size || size==0)
return ret_ans;
// 第一层循环 决定窗口的起始位置
for(int i =0;i<num.size()-size+1;i++)
{
int max=-1;
// 循环遍历窗口内的每一个值
for(int j =0;j<size;j++)
{
if(num[i+j]>max)
max=num[i+j];
}
// 存入最大的值
ret_ans.push_back(max);
}
return ret_ans;
}
};
方法二:之前的窗口的最大值是可以利用的
假设序列是 2,3,4,2,2,6,5,1 窗口为4
[ 2 3 4 2 ] 2 6 5 1 max=4
2 [ 3 4 2 2 ] 6 5 1 之前2342的max保存下来了,只要而淘汰的只是2,所以342的最大值还是4,只要用4和新来的2比较既可 得到max = 4
2 3 [ 4 2 2 6 ] 5 1 之前3422的max保存了,4还在,只要比较新来的6和4即可 max=6
.......
还有一种情况就是
序列 10 3 2 1 5 6 7 8 ... 窗口是3
[ 10 3 2 ] 1 5 6 7 8 第一次 max=10
10 [ 3 2 1 ] 5 6 7 8 因为max的10被删掉了,所以 应该全部重新找 max=3
10 3 [ 2 1 5 ] 6 7 8 因为3 被删掉了应该全部重新找 max=5
......
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> ret_ans;
// 方法二 不用每次在窗口找最大值
// 因为之前就已经找到了窗口内的最大值 如果说 删掉的是前一次窗口的最大值,那么需要重新遍历
// 但是如果删除的不是之前一个窗口的最大值,那就不需要重新遍历 只需要将最大值和最新加进来的值比较谁大 就可
// 直接暴力运算 每次找最大值保存进去
if(num.size()<size || size==0)
return ret_ans;
int max=-1;
// 第一层循环 决定窗口的起始位置
for(int i =0;i<num.size()-size+1;i++)
{
// 如果说 上一个窗口的最大值已经被删掉了 那么需要重新遍历找最大值
// i==0 表示第一次进来 此时肯定要循环
if(num[i-1] == max || i ==0){
max=-1;
// 循环遍历窗口内的每一个值
for(int j =0;j<size;j++){
if(num[i+j]>max)
max=num[i+j];
}
}
// 如果上一个窗口的最大值没有被删掉,只要比较最新加进来的值和之前的最大值 谁大就好
else{
if(max<num[i+size-1])
max=num[i+size-1];
}
// 存入最大的值
ret_ans.push_back(max);
}
return ret_ans;
}
};
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> ret_ans;
// 方法二 不用每次在窗口找最大值
// 因为之前就已经找到了窗口内的最大值 如果说 删掉的是前一次窗口的最大值,那么需要重新遍历
// 但是如果删除的不是之前一个窗口的最大值,那就不需要重新遍历 只需要将最大值和最新加进来的值比较谁大 就可
// 直接暴力运算 每次找最大值保存进去
if(num.size()<size || size==0)
return ret_ans;
int max=-1;
// 第一层循环 决定窗口的起始位置
for(int i =0;i<num.size()-size+1;i++)
{
// 如果说 上一个窗口的最大值已经被删掉了 那么需要重新遍历找最大值
// i==0 表示第一次进来 此时肯定要循环
if(num[i-1] == max || i ==0){
max=-1;
// 循环遍历窗口内的每一个值
for(int j =0;j<size;j++){
if(num[i+j]>max)
max=num[i+j];
}
}
// 如果上一个窗口的最大值没有被删掉,只要比较最新加进来的值和之前的最大值 谁大就好
else{
if(max<num[i+size-1])
max=num[i+size-1];
}
// 存入最大的值
ret_ans.push_back(max);
}
return ret_ans;
}
};