2.14日学习总结

news2025/2/15 9:08:52

题目一:接雨水问题

1.题目描述:给定一个数组 height 表示一个地形的高度图,数组中的每个元素代表每个宽度为 1 的柱子的高度。计算按此排列的柱子,下雨之后能接多少雨水。

2.示例:输入 height = [0,1,0,2,1,0,1,3,2,1,2,1],输出 6

3.思路:可以使用栈来解决。遍历数组,当栈为空或者当前高度小于等于栈顶元素高度时,将当前元素的索引入栈。当当前高度大于栈顶元素高度时,说明可以接雨水,不断弹出栈顶元素并计算接水量,直到栈为空或者当前高度小于等于栈顶元素高度。

AC代码:

#include <stdio.h>

// 计算接雨水量的函数
int t(int* h, int s) {
    int st[s];
    int t = -1;
    int a = 0;

    for (int i = 0; i < s; i++) {
        while (t != -1 && h[i] > h[st[t]]) {
            int ti = st[t--];
            if (t == -1) {
                break;
            }
            int l = st[t];
            int d = i - l - 1;
            int bh = (h[l] < h[i] ? h[l] : h[i]) - h[ti];
            a += d * bh;
        }
        st[++t] = i;
    }
    return a;
}

int main() {
    int h[] = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
    int s = sizeof(h) / sizeof(h[0]);
    int r = t(h, s);
    printf("接雨水的量为: %d\n", r);
    return 0;
}

题解:

要计算每个位置能接住多少雨水,关键在于看它左右两边最高的柱子。一个位置能接住的雨水量,等于它左右两边最高柱子高度的较小值减去它自身的高度。让栈像一个容器,我们把柱子的下标按柱子高度从高到低的顺序依次放进去。当遇到一个比栈顶柱子高的柱子时,就说明可以计算栈顶柱子和当前柱子之间能接住的雨水量了。

具体步骤
  1. 初始化

    • 创建一个栈,用来存储柱子的下标,初始时栈是空的。
    • 准备一个变量 ans,用来记录最终接住的雨水量,初始值为 0。
  2. 遍历柱子数组

    • 对于数组中的每个柱子:
      • 当栈不为空,并且当前柱子的高度大于栈顶柱子的高度时:
        • 把栈顶元素弹出,得到这个柱子的下标。
        • 如果弹出栈顶元素后栈为空了,说明没有左边界,没办法接住雨水,就停止计算这一轮。
        • 取出新的栈顶元素下标,作为左边界。
        • 计算当前柱子和左边界柱子之间的距离。
        • 计算能接住雨水的高度,也就是左右边界柱子高度的较小值减去弹出柱子的高度。
        • 用距离乘以高度,得到这部分的雨水量,累加到 ans 中。
      • 把当前柱子的下标放入栈中。
  3. 返回结果:遍历完所有柱子后,ans 就是最终能接住的雨水量。

复杂度分析
  • 时间复杂度:每个柱子最多入栈和出栈一次,所以时间复杂度是 ,这里的  是柱子数组的长度。
  • 空间复杂度:主要是栈的空间开销,最坏情况下栈需要存储所有柱子的下标,所以空间复杂度是 

 

题目二: 滑动窗口最大值

  1. 题目描述:给定一个数组 nums 和一个整数 k,请找出所有长度为 k 的滑动窗口中的最大值。

  2. 示例:输入 nums = [1,3,-1,-3,5,3,6,7]k = 3,输出 [3,3,5,5,6,7]

  3. 思路:可以使用单调队列来解决。单调队列是一种特殊的数据结构,它可以在  的时间内获取队列中的最大值或最小值。在遍历数组时,维护一个单调递减的队列,队列中存储数组的下标。当窗口移动时,判断队首元素是否在当前窗口内,如果不在则弹出队首元素,每次将当前窗口的最大值加入结果列表。

AC代码:

#include <stdio.h>
#include <stdlib.h>

// 计算滑动窗口最大值的函数
int* m(int* n, int ns, int k, int* rs) {
    if (ns == 0 || k == 0) {
        *rs = 0;
        return NULL;
    }
    *rs = ns - k + 1;
    int* r = (int*)malloc(sizeof(int) * (*rs));
    int q[ns];
    int f = 0, e = -1;

    for (int i = 0; i < ns; i++) {
        if (f <= e && q[f] <= i - k) {
            f++;
        }
        while (f <= e && n[q[e]] <= n[i]) {
            e--;
        }
        q[++e] = i;
        if (i >= k - 1) {
            r[i - k + 1] = n[q[f]];
        }
    }
    return r;
}

int main() {
    int n[] = {1, 3, -1, -3, 5, 3, 6, 7};
    int ns = sizeof(n) / sizeof(n[0]);
    int k = 3;
    int rs;
    int* r = m(n, ns, k, &rs);
    printf("滑动窗口最大值为: ");
    for (int i = 0; i < rs; i++) {
        printf("%d ", r[i]);
    }
    printf("\n");
    free(r);
    return 0;
}

题解:

我们可以使用单调队列来解决这个问题。单调队列是一种特殊的队列,队列里的元素要么单调递增,要么单调递减。在本题中,我们用单调递减队列来维护窗口内的最大值。队列里存储的是元素的下标,队首元素对应的就是当前窗口中的最大值。

具体步骤

  1. 特殊情况处理

    • 如果数组为空或者窗口大小为 0,直接返回空结果。

  2. 初始化

    • 计算结果数组的长度,它等于数组长度减去窗口大小再加 1。

    • 动态分配结果数组的内存。

    • 创建一个队列,用来存储元素的下标,同时设置队首和队尾指针。

  3. 遍历数组

    • 对于数组中的每个元素:

      • 先检查队首元素是否还在当前窗口内,如果不在,就把队首元素移除。

      • 然后维护队列的单调性,把队列中比当前元素小的元素都移除。

      • 把当前元素的下标放入队列。

      • 当窗口大小达到 k 时,队首元素对应的就是当前窗口的最大值,把这个值记录到结果数组中。

  4. 返回结果:遍历完数组后,结果数组里就存储了所有滑动窗口的最大值。

复杂度分析

  • 时间复杂度:每个元素最多入队和出队一次,所以时间复杂度是 ,其中  是数组的长度。

  • 空间复杂度:队列中最多存储  个元素,所以空间复杂度是 。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析

引言 在大数据与云原生技术快速发展的时代&#xff0c;开源技术成为推动行业进步的重要力量。本文将深入探讨三个备受瞩目的开源产品组件&#xff1a;DeepSeek、DataSophon 和 DolphinScheduler&#xff0c;分别从产品定义、功能、技术架构、应用场景、优劣势及社区活跃度等方面…

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展&#xff0c;相关领域人才需求激增&#xff0c;许多本科及职业院校纷纷开设云计算及相关专业方向。 然而&#xff0c;大多数院校在专业建设过程中面临以下困难&…

我的新书《青少年Python趣学编程(微课视频版)》出版了!

&#x1f389; 激动人心的时刻来临啦&#xff01; &#x1f389; 小伙伴们久等了&#xff0c;我的第一本新书 《青少年Python趣学编程&#xff08;微课视频版&#xff09;》 正式出版啦&#xff01; &#x1f4da;✨ 在这个AI时代&#xff0c;市面上的Python书籍常常过于枯燥&…

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…

DBSCAN 基于密度的空间带噪聚类法

DBSCAN 基于密度的空间带噪聚类法 DBSCAN&#xff08;Density - Based Spatial Clustering of Applications with Noise&#xff09;即基于密度的空间聚类算法&#xff0c;它是一种典型的密度聚类算法&#xff0c;以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。…

Python基于Django的漏洞扫描系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

或非门组成的SR锁存器真值表相关问题

PS&#xff1a;主要是给大家抛砖引玉&#xff0c;不喜勿喷。 问题描述&#xff1a;或非门组成的SR锁存器&#xff0c;为什么当SD和RD等于0时候的真值表一个是Q0&#xff0c;Q0.一个结果是Q1&#xff0c;Q1&#xff1f;

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…

unity删除了安卓打包平台,unityhub 还显示已经安装,怎么解决

解决问题地址 可能由于版本问题文章中这个我没搜到&#xff0c;应该搜Android Build Supprot

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

数据结构 day06

数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历&#xff08;画图&#xff09;7.2.5. 二叉…

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…

01什么是DevOps

在日常开发中&#xff0c;运维人员主要负责跟生产环境打交道&#xff0c;开发和测试&#xff0c;不去操作生产环境的内容&#xff0c;生产环境由运维人员操作&#xff0c;这里面包含了环境的搭建、系统监控、故障的转移&#xff0c;还有软件的维护等内容。 当一个项目开发完毕&…

力扣100. 相同的树(利用分解思想解决)

Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同&#xff0c;而此要求可以利用问题分解的思想解决&#xff0c;即判断当前节点的左右子树是否完全相同&#xff0c;而在二叉树问题分解的一般题目中均会带有返回值&#xff…

el-select 设置宽度 没效果

想实现下面的效果&#xff0c;一行两个&#xff0c;充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因&#xff1a; el-form 添加了 inline 所以删除inline属性 即可

chrome://version/

浏览器输入&#xff1a; chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) &#xff08;64 位&#xff09; (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…

反向代理块sjbe

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…