【LeetCode】HOT 100(13)

简介: 【LeetCode】HOT 100(13)

题单介绍:

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。


目录


题单介绍:


题目:78. 子集 - 力扣(Leetcode)


题目的接口:


解题思路:


代码:


过过过过啦!!!!


题目:84. 柱状图中最大的矩形 - 力扣(Leetcode)


题目的接口:


解题思路:


代码:


过过过过啦!!!!


写在最后:


题目:78. 子集 - 力扣(Leetcode)


题目的接口:

class Solution {
public:
    vector> subsets(vector& nums) {
    }
};

解题思路:

这道题也是经典的搜索题目,


直接进行深度优先搜索,因为不能出现重复的子集,


所以每次进行搜索的时候需要重新确定起点搜索,


这也就是 i = start 的原因,


代码如下:


代码:

class Solution {
public:
    vector> res;
    vector> subsets(vector& nums) {
        vector v;
        dfs(0, nums, v);
        return res;
    }
private:
    void dfs(int start, const vector& nums, vector& v) {
        res.push_back(v);
        for(int i = start; i < nums.size(); i++) {
            v.push_back(nums[i]);
            dfs(i + 1, nums, v);
            v.pop_back();
        }
    }
};

过过过过啦!!!!


题目:84. 柱状图中最大的矩形 - 力扣(Leetcode)


题目的接口:

class Solution {
public:
    int largestRectangleArea(vector& heights) {
    }
};

解题思路:

这道题的核心思路很巧妙,这里引用一下讨论区的大佬的话:


看了别人的答案想了半天才明白……其实可以把这个想象成锯木板,如果木板都是递增的那我很开心,如果突然遇到一块木板i矮了一截,那我就先找之前最戳出来的一块(其实就是第i-1块),计算一下这个木板单独的面积,然后把它锯成次高的,这是因为我之后的计算都再也用不着这块木板本身的高度了。再然后如果发觉次高的仍然比现在这个i木板高,那我继续单独计算这个次高木板的面积(应该是第i-1和i-2块),再把它俩锯短。直到发觉不需要锯就比第i块矮了,那我继续开开心心往右找更高的。当然为了避免到了最后一直都是递增的,所以可以在最后加一块高度为0的木板。


这个算法的关键点是把那些戳出来的木板早点单独拎出来计算,然后就用不着这个值了。说实话真的很佩服第一个想出来的人……


简单来说,这道题的核心就是:


遍历这个数组,


每当找到最高的柱子,就更新最高的柱子的面积,


然后循环求出跟其他柱子组合的面积,找出他们的最大面积


然后继续往后遍历,


为了防止遍历到最后一直是递增导致进不去循环,就给该数组最后加上了0。


代码如下:


代码:

class Solution {
public:
    int largestRectangleArea(vector& heights) {
        vector st;
        int ans = 0;
        heights.insert(heights.begin(), 0);
        heights.insert(heights.end(), 0);
        for(int i = 0; i < heights.size(); i++) {
            while(!st.empty() && heights[st.back()] > heights[i]) {
                int high = st.back();
                st.pop_back();
                int left = st.back() + 1;
                int right = i - 1;
                ans = max(ans, (right - left + 1) * heights[high]);
            }
            st.push_back(i);
        }
        return ans;
    }
};


过过过过啦!!!!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果感到有所收获的话可以给博主点一个赞哦。



相关文章
|
算法
【LeetCode】HOT 100(14)
【LeetCode】HOT 100(14)
73 1
|
存储 人工智能 算法
HOT 100(61~80)【LeetCode】1
HOT 100(61~80)【LeetCode】1
77 0
|
算法
【LeetCode】HOT 100(22)
【LeetCode】HOT 100(22)
51 0
|
算法
【LeetCode】HOT 100(18)
【LeetCode】HOT 100(18)
87 1
|
缓存 算法
【LeetCode】HOT 100(17)
【LeetCode】HOT 100(17)
79 2
|
算法
【LeetCode】HOT 100(16)
【LeetCode】HOT 100(16)
70 1
|
算法
HOT 100(41~60)【LeetCode】1
HOT 100(41~60)【LeetCode】1
55 0
|
存储 算法
HOT 100(61~80)【LeetCode】3
HOT 100(61~80)【LeetCode】3
33 0
|
算法
HOT 100(61~80)【LeetCode】4
HOT 100(61~80)【LeetCode】4
60 0
|
机器学习/深度学习
HOT 100(21~40)【LeetCode】1
HOT 100(21~40)【LeetCode】1
46 0