美文网首页
2020-08-27 刷题3 动态规划&&深度优先搜索

2020-08-27 刷题3 动态规划&&深度优先搜索

作者: nowherespyfly | 来源:发表于2020-08-28 00:06 被阅读0次

84 柱状图中的最大矩形

每个高度的矩形宽度取决于向左数第一个不大于这个高度的位置,和向右数第一个小于这个高度的位置的距离。
用单调栈,栈顶元素为最大值。每次遍历到第i个位置时,如果它的高度大于栈顶元素,说明这个柱子前的柱子高度都没有它高,因此还无法确定这个高度矩形大小,直接将其入栈;但如果低于栈顶的元素,那么栈顶元素的高度对应矩形就可以确定了,这个元素可以出栈,左边界是当前栈顶元素的位置或者数组开头。
这里在数组最后添加了一个哨兵0,是一个非常好用的技巧,可以避免一些条件判断。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        int i = 0;
        int max_size = 0;
        heights.push_back(0);
        while(i < heights.size()){
            while(!s.empty() && heights[s.top()] > heights[i]){
                int tmp = s.top();
                s.pop();
                int cur_size = heights[tmp] * (s.empty() ? i : (i - s.top() - 1));
                max_size = max(max_size, cur_size);
            }
            s.push(i);
            i++;
        }
        return max_size;
    }
};

85 最大矩形

这个题目是上一个题目的延续,首先将原来的数组转化成到每个位置为止的高度,这样每一行就变成了一个柱状图的高度,然后在每一行上运用84题的解法,求出最大的矩形面积。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        int i = 0;
        int max_size = 0;
        heights.push_back(0);
        while(i < heights.size()){
            while(!s.empty() && heights[s.top()] > heights[i]){
                int tmp = s.top();
                s.pop();
                int cur_size = heights[tmp] * (s.empty() ? i : (i - s.top() - 1));
                max_size = max(max_size, cur_size);
            }
            s.push(i);
            i++;
        }
        return max_size;
    }

    int maximalRectangle(vector<vector<char>>& matrix) {
        vector<vector<int>> dp;
        if(matrix.size() == 0)
            return 0;
        int row_num = matrix.size(), col_num = matrix[0].size();
        for(int i = 0; i < row_num; i++){
            vector<int> a(col_num);
            for(int j = 0; j < col_num; j++){
                a[j] = matrix[i][j] - '0';
            }
            dp.push_back(a);
        }
        for(int i = 0; i < col_num; i++){
            for(int j = 1; j < row_num; j++){
                if(dp[j][i] > 0)
                    dp[j][i] = dp[j - 1][i] + 1;  
            }
        }
        int max_area = 0;
        for(int i = 0; i < row_num; i++){
            int cur_area = largestRectangleArea(dp[i]);
            max_area = max(max_area, cur_area);
        }
        return max_area;
    }
};

200 岛屿数量

深搜

class Solution {
public:
    void dp(vector<vector<char>>& grid, int i, int j){
        if(i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size())
            return;
        if(grid[i][j] == '0')
            return;
        grid[i][j] = '0';
        dp(grid, i - 1, j);
        dp(grid, i + 1, j);
        dp(grid, i, j - 1);
        dp(grid, i, j + 1);
    }
    int numIslands(vector<vector<char>>& grid) {
        if(grid.size() == 0)
            return 0;
        int island = 0, row_num = grid.size(), col_num = grid[0].size();
        for(int i = 0; i < row_num; i++){
            for(int j = 0; j < col_num; j++){
                if(grid[i][j] == '1'){
                    dp(grid, i, j);
                    island++;
                }
            }
        }
        return island;
    }
};

相关文章

  • 2020-08-27 刷题3 动态规划&&深度优先搜索

    84 柱状图中的最大矩形 每个高度的矩形宽度取决于向左数第一个不大于这个高度的位置,和向右数第一个小于这个高度的位...

  • LeetCode ---- 热门标签分类

    标签分类(涉及>=50题) 1.数组。2.动态规划。3.数学。4.字符串。5.树。6.哈希表。7.深度优先搜索。8...

  • 2020-08-04 算法分类

    1、动态规划 2、贪心 3、查找 二分查找 二叉搜索树 深度/广度优先搜索 4、排序 写于20200804晚,晴

  • LeetCode中的题目的特点

    解这些题都是有套路的,不是用递归(深度优先DFS,广度优先BFS),就是要用动态规划(Dynamic Progra...

  • iOS开发集锦之 2017.04.12(Swift 算法实战之路

    1. Swift 算法实战之路:动态规划 作者: 故胤道长描述: 深度优先搜索(Depth-First-Searc...

  • 算法

    算法应用BFS广度优先搜索DFS深度优先搜索回溯法(DFS+剪枝)部分和问题分治法快速排序、归并排序动态规划背包问...

  • 787. K站中转内最便宜的航班(Python)

    难度:★★★★☆类型:图方法:深度优先搜索,动态规划 力扣链接请移步本题传送门[https://leetcode-...

  • 算法入门:栈与递归

    在此之前,我们介绍了动态规划、深度优先搜索等基础算法,但是,有部分好友评论说,难度太难了,我们知道动态规划的自顶向...

  • 高频题

    字符串 数学 数组 二叉树 二分查找 链表 动态规划 贪心算法 堆 广度优先搜索 深度优先 哈希表 回溯算法 设计

  • Leetcode上的dfs问题

    下面的题目是我刷的Leetcode上关于深度优先搜索的题目,因为题还没刷完,所以这篇文章会将不时地进行续更

网友评论

      本文标题:2020-08-27 刷题3 动态规划&&深度优先搜索

      本文链接:https://www.haomeiwen.com/subject/eaxksktx.html