算法打卡第二天

news2025/5/23 8:28:43

5.爬楼梯(动态规划)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45
class Solution {
public:
    int climbStairs(int n) {
    // 动态规划 递归
    if(n <= 1)// 因为下面直接对dp[2]操作了,防止空指针
         return n;
    // 从0开始的
    vector <int> dp(n + 1);
    // 0舍弃
    dp [1] = 1;
    dp [2] = 2;
    // 从第三个楼梯处理
    for(int i = 3; i <= n ; ++i)
    {
        dp[i] = dp[i - 1] + dp [i - 2];
    }
    return dp[n];
    }
  
};

6.打家劫舍(动态规划)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。
/*
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。*/
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
    // 递归
    int rob(vector<int> &nums)
    {
        // 特殊情况
        // 没有房间 结束
        if (nums.size() == 0)
            return 0;
        // 只有一个房间 偷第一个房间
        if (nums.size() == 1)
            return nums[0];

        // 定义一个容器 动态数组
        vector<int> dp(nums.size());
        // 初始化第一个第二个元素 
        dp[0] = nums[0];//只有下标0房间只能偷
        dp[1] = max(nums[0], nums[1]);//有0有1选择大的偷
        // 从第三个元素遍历
        for(int i = 2; i < nums.size(); ++i)
        {
            // 两种情况 第一中情况有i 第二种没有i
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1] ) ;
        }
        // 返回最大值
        return dp[nums.size() - 1];
    }
};
int main()
{

    vector<int> arr1 = {1,2,3,1};
    vector<int> arr2= {2,7,9,3,1};
    Solution s ;
    cout << s.rob(arr1) << endl;
    cout << s.rob(arr2) << endl;



    return 0;
}

7.移除元素(数组 双指针)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,,]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,,,_]
解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

  • 思路就是两个指针,数组快指针的值付给慢指针,同时移动,当遇到目标值快指针继续移动,但是不把值给满指针,然后返回数组慢指针的值,就是新数组
// 双指针法(快慢指针法

// 思路就是两个指针,数组快指针的值付给慢指针,同时移动,当遇到目标值快指针继续移动,但是不把值给满指针,然后返回数组慢指针的值,就是新数组
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
    int removeElement(vector<int> &nums, int val)
    {
        // 慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) // fastIndex是快指针
        {
            // 当快指针指向的值不等于目标值
            if (val != nums[fastIndex])
            {
                // 把快指针的值付给慢指针
                nums[slowIndex++] = nums[fastIndex];
            }
            // 当快指针指向的值等于目标值就不把快指针的值付给慢指针
        }
        // 返回慢指针 它是新数组中不等于 val 的元素的数量
        return slowIndex;
    }
};
int main()
{

    vector<int> arr1 = {3, 2, 2, 3};
    vector<int> arr2 = {0, 1, 2, 2, 3, 0, 4, 2};
    Solution s;

    int k1 = s.removeElement(arr1, 3);
    cout << s.removeElement(arr1, 3) << endl;
    for (int i = 0; i < k1; i++)
    {
        cout << arr1[i] << " ";
    }
    cout << endl;
    cout << "=============" << endl;
    int k2 = s.removeElement(arr2, 2);
    cout << k2 << endl;
    for (int i = 0; i < k2; i++)
    {
        cout << arr2[i] << " ";
    }

    return 0;
}

8.二分查找(数组)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

使用左闭右闭即**[left, right]**

  • while (left <= right) 要使用 <= ,因为left == right是有意义的(都是闭的),所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为已经判断力这个nums[middle]一定不是target,而且是[left, right],是包含right 的,那么接下来要查找的左区间结束下标位置就是 middle - 1
/*
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。*/
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
    int search(vector<int> &nums, int target)
    // 二分查找
    {
        // 左右下标
        int left = 0;                // 第一个
        int right = nums.size() - 1; // 最后一个  定义target在左闭右开的区间里,即:[left, right)
        while (left <= right)        // 当left==right,区间[left, right]依然有效,所以用 <=
        {

            int middle = left +((right - left) / 2) ; // 避免越界
            if (nums[middle] > target)                // 在左边
            {
                right = middle - 1;
            }
            else if (nums[middle] < target) // 在右边
            {
                left = middle + 1;
            }
            else // 找到了目标值 返回
            {
                return middle;
            }
           
        }// 循环完了没有找到
        return -1;
    }
};
int main()
{
    Solution s;
    vector<int> arr1 = {-1, 0, 3, 5, 9, 12};
    vector<int> arr2 = {-1, 0, 3, 5, 9, 12};
  
    cout << s.search(arr1, 9) << endl;
    cout << s.search(arr2, 2) << endl;

    return 0;
}

9.有序数组的平方 (数组 双指针)

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

思路:

  • 双指针法
    • 定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置
    • 思路就是两个指针,头指针指向0,尾指针指向最后一个元素,比较
    • 头尾就移动头指针向中间移动,反之就是尾指针向中间移动,
/*
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。


*/

// 双指针法
// 定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置
// 思路就是两个指针,头指针指向0,尾指针指向最后一个元素,比较
// 头》尾就移动头指针向中间移动,反之就是尾指针向中间移动,

#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
    vector<int> sortedSquares(vector<int> &nums)
    {
        // 新数组 存储平方数组
        vector<int> result(nums.size(), 0);
        int k = nums.size() - 1; // 元素末尾
        // 定义两个指针循环
        int i = 0; 
        int j = nums.size() - 1;
        while(i <= j) // i <= j,因为最后要处理两个元素
        {
            // 头平方大于尾平方
            if (nums[i] * nums[i] > nums[j] * nums[j])
            {

                result[k--] = nums[i] * nums[i];
                i++;
            }
            // 头平方小于尾平方
            else
            {
                result[k--] = nums[j] * nums[ j];
                j--;
            }
        }
        return result;
    }
};
int main()
{

    vector<int> arr1 = {-4, -1, 0, 3, 10};
    vector<int> arr2 = {-7, -3, 2, 3, 11};
    Solution s;

    vector<int> arr3 = s.sortedSquares(arr1);

    for (int i = 0; i < arr3.size(); i++)
    {
        cout << arr3[i] << " ";
    }
    cout << endl;

    vector<int> arr4 = s.sortedSquares(arr2);
    for (int i = 0; i < arr4.size(); i++)
    {
        cout << arr4[i] << " ";
    }

    return 0;
}

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

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

相关文章

VSCode推出开源Github Copilot:AI编程新纪元

文章目录 开源决策的背后GitHub Copilot的演进历程Copilot Chat核心功能解析1. 聊天界面集成2. 代码理解与生成3. 多文件编辑能力4. 智能代理模式 开源后的影响与展望对开发者的影响对AI编程工具市场的影响未来发展方向 如何开始使用GitHub Copilot结语相关学习资源 在AI编程助…

Mujoco 学习系列(四)官方模型仓库 mujoco_menagerie

mujoco 官方在 Github 上发布了一个他们自己整理的高质量的模型仓库&#xff0c;这个仓库是一个持续维护的项目&#xff0c;里面包含了目前市面上常见的人形机器人、机械臂、底盘等模型&#xff0c;对于初学者而言是一个非常好的学习资料&#xff0c;无论是想在仿真环境中尝试还…

代码走读 Go 语言 Map 的实现

序言 在日常的开发当中&#xff0c;我们一定离不开一个数据结构字典。不仅可以存储关联数据对&#xff0c;还可以在 O(1) 的时间复杂度进行查找。很久之前在 一篇文章带你实现 哈希表 介绍了相关的原理以及简单的实现。所以这篇文章中我们就不多赘述哈希表的原理&#xff0c;而…

PostgreSQL14 +patroni+etcd+haproxy+keepalived 集群部署指南

使用postgresql etcd patroni haproxy keepalived可以实现PG的高可用集群&#xff0c;其中&#xff0c;以postgresql做数据库&#xff0c;Patroni监控本地的PostgreSQL状态&#xff0c;并将本地PostgreSQL信息/状态写入etcd来存储集群状态&#xff0c;所以&#xff0c;patr…

数据结构知识点汇总

1、在数据结构中&#xff0c;随机访问是指能够直接访问任一元素&#xff0c;而不需要从特定的起始位置开始&#xff0c;也不需要按顺序访问其他元素。这种访问方式通常不涉及遍历。例如&#xff0c;数组&#xff08;array&#xff09;支持随机访问&#xff0c;你可以直接通过索…

基于YOLO11深度学习的变压器漏油检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】

文章目录 引言软件主界面源码目录文件说明一、环境安装(1)安装python(2)安装软件所需的依赖库 二、软件核心功能介绍及效果演示(1)软件核心功能(2)软件效果演示 三、模型的训练、评估与推理(1)数据集准备与训练(2)训练结果评估(3)使用训练好的模型识别 四、完整相关文件及源码下…

Python 包管理工具核心指令uvx解析

uvx 是 Python 包管理工具 uv 的重要组成部分&#xff0c;主要用于在隔离环境中快速运行 Python 命令行工具或脚本&#xff0c;无需永久安装工具包。以下是其核心功能和使用场景的详细解析&#xff1a; 一、uvx 的定位与核心功能 工具执行器的角色 uvx 是 uv tool run 的别名&a…

苍穹外卖05 Redis常用命令在Java中操作Redis_Spring Data Redis使用方式店铺营业状态设置

2-8 Redis常用命令 02 02-Redis入门 ctrlc :快捷结束进程 配置密码&#xff1a; 以后再启动客户端的时候就需要进行密码的配置了。使用-a 在图形化界面中创建链接&#xff1a; 启动成功了。 03 03-Redis常用数据类型 04 04-Redis常用命令_字符串操作命令 05 05-Redis常用命令…

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…

【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案

一、应用场景 在古籍数字化、繁体文档处理、两岸三地文化交流等场景中,经常需要将竖排繁体文字转换为横排文字。例如: 古籍研究人员需要将竖排繁体文献转换为现代横排简体格式以便编辑和研究出版行业需要将繁体竖排排版转换为简体横排格式两岸三地交流中需要将繁体竖排文档转…

NFS服务器实验

实验要求 架设一台NFS服务器&#xff0c;并按照以下要求配置 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3…

Java进阶之新特性

Java新特性 参考 官网&#xff1a;https://docs.oracle.com/en/ JDK5新特性 1.自动装箱与拆箱 自动装箱的过程&#xff1a;每当需要一种类型的对象时&#xff0c;这种基本类型就自动地封装到与它相同类型的包装类中。 自动拆箱的过程&#xff1a;每当需要一个值时&#xf…

AIGC工具平台-卡通图片2D转绘3D

本模块是一款智能化的2D转3D图像处理工具&#xff0c;能够将卡通风格的2D图片自动转换为高质量3D渲染模型&#xff0c;让平面图像焕发立体生机。借助先进的AI深度学习算法&#xff0c;该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素&#xff0c;自动生成逼真的3D形…

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法&#xff08;Virtual Method&#xff09;非虚方法&#xff08;Non-Virtual Method&#xff09; 方法返回地址 方法调用 我们编写Java程序的时候&#xff0c;我们自己写的类通常不仅仅是调用自己本类的方法。调用别…

JMeter JDBC请求Query Type实测(金仓数据库版)

文章目的 在实际性能测试中&#xff0c;JMeter的JDBC Request组件常用于模拟数据库操作。但许多用户对Query Type参数的具体行为存在疑惑。 本文将以金仓数据库KingbaseES为例&#xff0c;通过实测验证每种Query Type的行为&#xff0c;帮助用户明确其使用场景和限制&#xff…

【内部教程】ISOLAR-AB配置以太网栈|超详细实战版

目录 往期推荐 缩写与定义 关于系统描述&#xff08;System Description&#xff09; 1.1 EthCommunicationController 1.2 EthCommunicationConnector 1.2.1 Ports&#xff08;端口&#xff09; 1.3 EthPhysicalChannel&#xff08;以太网物理通道&#xff09; 1.3.1…

Nginx 核心功能

目录 一&#xff1a;正向代理 1&#xff1a;编译安装 Nginx &#xff08;1&#xff09;安装支持软件 &#xff08;2&#xff09;创建运行用户、组和日志目录 &#xff08;3&#xff09;编译安装 Nginx &#xff08;4&#xff09;添加 Nginx 系统服务 2&#xff1a;配置正…

【Canvas与图标】圆角方块蓝星CSS图标

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…

C#新建打开文件对话框

这是Winform直接封装好的打开文件对话框 using System.Windows.Forms; public static string OpenFile(string path) {OpenFileDialog openFileDialog new OpenFileDialog();// 设置对话框属性openFileDialog.Title "选择文件";openFileDialog.InitialDirectory …