【done+重点】剑指offer——面试题65:滑动窗口的最大值

力扣,https://leetcode.cn/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/description/

解法1:暴力遍历

class Solution {
    public int[] maxAltitude(int[] heights, int limit) {
        if (heights.length == 0) {
            return new int[0];
        }
        int[] res = new int[heights.length - limit + 1];
        int val = Integer.MIN_VALUE;
        for (int i = 0; i + limit <= heights.length; ++i) {
            val = Integer.MIN_VALUE;
            for (int k = i; k < i + limit; ++k) {
                val = val > heights[k] ? val : heights[k];
            }
            res[i] = val;
        }

        return res;
    }
}

解法2:双端队列

关于java中LinkedList,Stack,Queue,Deque总结

class Solution {
    public int[] maxAltitude(int[] heights, int limit) {
        if (heights.length == 0) {
            return new int[0];
        }
        Deque<Integer> deque = new LinkedList<>();
        int[] res = new int[heights.length - limit + 1];
        for (int i = 0; i < limit; ++i) {
            if (deque.size() == 0) {
                deque.offerLast(heights[i]);
            } else {
                while (deque.size() > 0 && deque.peekLast() < heights[i]) {
                    deque.pollLast();
                }
                deque.offerLast(heights[i]);
            }
        }
        res[0] = deque.peekFirst();
        for (int right = limit; right < heights.length; ++right) {
            int left = right - limit;
            if (heights[left] == deque.peekFirst()) {
                deque.pollFirst();
            }
            while (deque.size() > 0 && deque.peekLast() < heights[right]) {
                deque.pollLast();
            }
            deque.offerLast(heights[right]);
            res[right - limit + 1] = deque.peekFirst();
        }

        return res;
    }
}

##Solution1:
笨蛋方法啊。。

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> res;
        if(num.size() == 0 || size <= 0 || num.size() < size)
            return res;
        int start = 0, end = size - 1;
        int max_win = my_max(num, start, end);
        res.push_back(max_win);
        start++;
        end++;
        while(end < num.size()) {
            max_win = my_max(num, start, end);
            res.push_back(max_win);
            start++;
            end++;
        }
        return res;
    }
    
    int my_max(const vector<int>& num, int start, int end) {
        int res = INT_MIN;
        for(int i = start; i <= end; i++) {
            if(num[i] >= res)
                res = num[i];
        }
        return res;
    }
};

#Solution2:
20180916日重做
参考网址:https://www.nowcoder.com/profile/1710251/codeBookDetail?submissionId=17436906
这个思路真是精巧~

//引用马客(Mark)的解题思路,马客没加注释,我用自己的理解加下注释,希望对你们有用,
//如有错误,见谅,我会及时修改。
//deque s中存储的是num的下标
class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> res;
        deque<int> s;
        for(unsigned int i=0;i<num.size();++i){
            while (s.size() && num[s.back()] <= num[i])
            //从后面依次弹出队列中比当前num值小的元素,同时也能保证队列首元素为当前窗口最大值下标
                s.pop_back();
            while (s.size() && i - s.front() + 1>size)
            //当当前窗口移出队首元素所在的位置,即队首元素坐标对应的num不在窗口中,需要弹出
                s.pop_front();
            s.push_back(i);//把每次滑动的num下标加入队列
            if (size && i >= size - 1)
            //当滑动窗口首地址i大于等于size时才开始写入窗口最大值
                res.push_back(num[s.front()]);
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值