408算法题leetcode--第27天

42. 接雨水

题目地址42. 接雨水 - 力扣(LeetCode)

题解思路:暴力,接雨水的总和 = 每一列接水的总和;一列的接水数量 = min(左边最高,右边最高) - 当前列的高度

时间复杂度:O(n^2)

空间复杂度:O(1)

代码:

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        // 暴力
        int ret = 0;
        int size = height.size();
        for(int i = 0; i < size; i++){
            if(i == 0 || i == size - 1){
                continue;
            }
            int left = i, right = i;
            for(int j = i - 1; j >= 0; j--){
                if(height[j] > height[left]){
                    left = j;
                }
            }
            for(int j = i + 1; j < size; j++){
                if(height[j] > height[right]){
                    right = j;
                }
            }
            if(left != i && right != i){
                ret += min(height[left], height[right]) - height[i];
            }
        }
        return ret;
    }
};

优化思路:对于内层for循环寻找左右最大的高度,可以进行预处理操作,用单调栈提前保存;如注释

时间复杂度:O(n)

空间复杂度:O(n)

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        // 递增栈:三个数据,当前遍历的高度,top指向底部的下标,top的下一个指向左边最高的数
        // S = 高(min(h[i], h[top.next]) - h[top]) * 宽(i - top.next - 1)
        if(height.size() <= 2) return 0;
        stack<int>stk;
        stk.push(0);
        int ret = 0;
        int size = height.size();
        for(int i = 1; i < size; i++){
            if(height[i] <= height[stk.top()]){
                stk.push(i);
            } else {
                while(!stk.empty() && height[i] > height[stk.top()]){
                    int mid = stk.top();
                    stk.pop();
                    if(!stk.empty()){
                        int h = min(height[i], height[stk.top()]) - height[mid];
                        int w = i - stk.top() - 1;
                        ret += h * w;
                    }
                }
                stk.push(i);
            }
        }
        return ret;
    }
};

108. 将有序数组转换为二叉搜索树

题目地址108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

题解思路:dfs

时间复杂度:O(n)

空间复杂度:O(logn)

代码:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* dfs(vector<int>& nums, int left ,int right){
        // 参数和返回类型
        // 终止条件
        // 递归逻辑
        if(left > right){
            return nullptr;
        }
        // 分割
        int mid = left + (right - left) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = dfs(nums, left, mid - 1);
        root->right = dfs(nums, mid + 1, right);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return dfs(nums, 0, nums.size() - 1);
    }
};
相关推荐
HAPPY酷3 分钟前
Python高级架构师之路——从原理到实战
java·python·算法
枫叶林FYL17 分钟前
第9章 因果推理与物理理解
人工智能·算法·机器学习
小白zlm36 分钟前
预畸变双线性变换
单片机·嵌入式硬件·算法·电机控制
wuweijianlove1 小时前
算法复杂度估算的实验建模与可视化表达的技术6
算法
执笔画流年呀1 小时前
7大排序算法
java·算法·排序算法
AI成长日志1 小时前
【算法学习专栏】动态规划基础·中等两题精讲(198.打家劫舍、322.零钱兑换)
学习·算法·动态规划
计算机安禾1 小时前
【数据结构与算法】第28篇:平衡二叉树(AVL树)
开发语言·数据结构·数据库·线性代数·算法·矩阵·visual studio
测试_AI_一辰1 小时前
AI 如何参与 Playwright 自动化维护:一次自动修复闭环实践
人工智能·算法·ai·自动化·ai编程
未来之窗软件服务2 小时前
算法设计—计算机等级考试—软件设计师考前备忘录—东方仙盟
算法·软件设计师·计算机等级考试
未来之窗软件服务2 小时前
哈夫曼树构造—计算机等级考试—软件设计师考前备忘录—东方仙盟
算法·软件设计师·计算机等级考试·仙盟创梦ide·东方仙盟