[Algorithm][贪心][整数替换][俄罗斯套娃信封问题]详细讲解

news2024/12/23 18:40:52

目录

  • 1.整数替换
    • 1.题目链接
    • 2.算法原理详解
      • 1.解法一
      • 2.解法二
    • 3.代码实现
      • 1.代码一
      • 2.代码二
  • 2.俄罗斯套娃信封问题
    • 1.题目链接
    • 2.算法原理详解
      • 1.解法一
      • 2.解法二
    • 3.代码实现
      • 1.代码一
      • 2.代码二


1.整数替换

1.题目链接

  • 整数替换

2.算法原理详解

1.解法一

  • 思路:模拟(递归 + 记忆化搜索)
    请添加图片描述

2.解法二

  • 思路:贪心
    • 偶数:只能执行/2操作
    • 奇数:分类讨论
      请添加图片描述

3.代码实现

1.代码一

class Solution 
{
    unordered_map<int, int> hash;
public:
    int integerReplacement(int n) 
    {
        return DFS(n);
    }

    int DFS(long long n)
    {
        if(hash.count(n))
        {
            return hash[n];
        }

        if(n == 1)
        {
            hash[1] = 0;
            return 0;
        }

        if(n % 2 == 0)
        {
            hash[n] = 1 + DFS(n / 2);
        }
        else
        {
            hash[n] = 1 + min(DFS(n - 1), DFS(n + 1));
        }

        return hash[n];
    }
};

2.代码二

int integerReplacement(int n) 
{
    int ret = 0;
    while(n > 1)
    {
        if(n % 2 == 0)
        {
            n /= 2;
            ret++;
        }
        else
        {
            if(n == 3)
            {
                ret += 2;
                n = 1;
            }
            else if(n % 4 == 1)
            {
                n = n / 2; // -> (n - 1) / 2
                ret += 2;
            }
            else
            {
                n = n / 2 + 1; // -> (n + 1) / 2 -> 防溢出
                ret += 2;
            }
        }
    }

    return ret;
}

2.俄罗斯套娃信封问题

1.题目链接

  • 俄罗斯套娃信封问题

2.算法原理详解

  • 知识储备:最长递增子序列 --> 动态规划 + 贪心 + 二分

1.解法一

  • 解法:常规解法(通用解法) -> 动态规划(该题会超时)
    • 思考历程:乱序 --> 有序 --> 按照左端点排序 --> 最长递增子序列
    • 思路
      • 状态表示dp[i]:以i位置的信封为结尾的所有套娃序列中,最长的套娃序列的长度

      • 状态转移方程
        请添加图片描述

      • 返回值dp表中的最大值


2.解法二

  • 思路:重写排序 + 贪心 + 二分
    • 重写排序:此时,问题完全转化为最长递增子序列
      • 左端点不同时:左端点从小到大排序
      • 左端点相同时:右端点从大到小排序

3.代码实现

1.代码一

int maxEnvelopes(vector<vector<int>>& e) 
{
    sort(e.begin(), e.end());

    int n = e.size();
    vector<int> dp(n, 1);

    int ret = 1;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(e[i][0] > e[j][0] && e[i][1] > e[j][1])
            {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }

        ret = max(ret, dp[i]);
    }

    return ret;
}

2.代码二

int maxEnvelopes(vector<vector<int>>& e) 
{
    // 重写排序
    sort(e.begin(), e.end(), [&](const vector<int>& v1, const vector<int>& v2)
         {
             return v1[0] != v2[0] ? v1[0] < v2[0] : v1[1] > v2[1];
         });

    // 贪心 + 二分
    vector<int> ret;
    ret.push_back(e[0][1]);

    for(int i = 1; i < e.size(); i++)
    {
        int b = e[i][1];
        if(b > ret.back())
        {
            ret.push_back(b);
        }
        else
        {
            int left = 0, right = ret.size() - 1;
            while(left < right)
            {
                int mid = (left + right) / 2;
                if(ret[mid] >= b)
                {
                    right = mid;
                }
                else
                {
                    left = mid + 1;
                }
            }

            ret[left] = b;
        }
    }

    return ret.size();
}

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

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

相关文章

unity学习-渲染优化

cpu与gpu的区别 cpu&#xff1a;什么都干&#xff0c;主要处理代码的逻辑与传递信息&#xff0c;将需要DrewCall传递进gpu gpu&#xff1a;主要处理渲染方面&#xff0c;实现DrewCall 层级细节LOD技术 我们在unity中一个模型如果距离远了看起来就会模糊&#xff0c;但是它实…

独家揭秘!成为CSDN人工智能优质创作者:我的故事和心得

你好&#xff0c;我是三桥君 晚上我打开消息中心提醒发现&#xff0c;CSDN官方博客居然关注我了&#xff01;我又喜又惊&#xff01;喜是官方博客也认可我了&#xff01;惊是为啥关注我嘞&#xff1f; 突然想到&#xff0c;国庆放假前一天下午&#xff0c;我申请了“创作者认证…

GNURadio 平台实现SSB信号调制解调

目录 一、SSB 信号调制解调原理 二、搭建的GRC流图 一、SSB 信号调制解调原理 1.SSB调制原理 DSB信号虽然相比AM信号节约了功率利用率&#xff0c;但是信号带宽与AM信号一样&#xff0c;是基带信号最大频率的2倍。DSB信号上下边带信号完全一样&#xff0c;传递信息一样&…

Android Studio New里面没有New Flutter Project

跟着Flutter中文网的配置教程&#xff0c;安装好了flutter,在Android studio里面也安装了dart和flutter的插件。重启后还是在FIle->New里面没有显示New Flutter Project。 反复卸载重装dart和flutter插件好几次&#xff0c;依然没有效果。 原来是没有把Android APK Suppor…

收银台实现iframe跨页面调用函数的方法——未来之窗行业应用跨平台架构

一、访问子页面 window.frames["子frame名称"].函数(); window.frames["子frame名称"].未来之窗_人工智能_并行传送阵(t,u,N,); 二、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技…

要在 Git Bash 中使用 `tree` 命令,下载并手动安装 `tree`。

0、git bash 安装 git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作) 1、下载并手动安装 tree 下载 tree.exe 从 tree for Windows 官方站点 下载 tree 的 Windows 可执行文件。tree for Window&#xff1a;https://gnuwin32.source…

ubuntu安装HALCON-23.11-Progress新版本

问题描述 halcon最近升级了&#xff0c;领导希望我将halcon升级成最新版本&#xff0c;由此记录升级过程。之前在我的电脑上安装了20.11-steady版本&#xff0c;在不卸载之前版本的前提下&#xff0c;让两个版本共存。 1.官网下载安装包 官网链接: https://www.mvtec.com/pr…

windows C++-创建图像处理的异步消息(三)

完整实例 以下代码显示完整示例是基于wmain 函数和 GDI 库&#xff0c;并调用 ProcessImages 函数以处理 默认目录中的 JPEG 文件。 // image-processing-network.cpp // compile with: /DUNICODE /EHsc image-processing-network.cpp /link gdiplus.lib #include <windo…

制造企业MES管理系统的应用策略与实施路径

在智能制造浪潮的席卷之下&#xff0c;MES管理系统作为连接生产计划与车间操作的核心桥梁&#xff0c;其战略地位愈发显著。本文旨在深入剖析MES管理系统在智能制造转型中的核心价值、实施策略及实践路径&#xff0c;为制造企业探索智能化生产之路提供实践指导与灵感启发。 MES…

火山引擎边缘智能亮相“地瓜机器人开发者大会”,推动端侧大模型应用与落地

9 月 20 日&#xff0c;2024 地瓜机器人开发者日暨新品发布在深圳科创学院南山总部成功举办&#xff0c;火山引擎边缘智能受邀出席此次会议。会议以“加速智能生长”为主题&#xff0c;发布了地瓜机器人新一代机器人开发者套件 RDK X5 &#xff0c;同时&#xff0c;会议汇聚了中…

Puppeteer自动化:使用JavaScript定制PDF下载

引言 在现代的Web开发中&#xff0c;自动化已经成为提高效率和减少重复劳动的重要手段。Puppeteer 是一个强大的Node.js库&#xff0c;提供了对无头Chrome或Chromium的控制&#xff0c;可以用于生成网页快照、抓取数据、自动化测试等任务。其中&#xff0c;生成PDF文件是一个常…

【TOP K】leetcode 215.数组中第K个最大的元素

1 题目描述 题目链接&#xff1a;数组中第K个最大的元素 2 题目解析 首先区分 第K个最大的元素和 第K个不同的元素 考虑使用什么数据结构&#xff1f; 使用堆的数据结构&#xff0c;可以使用priority_queue&#xff0c;然后 建大堆&#xff0c;这样大的元素就在前面。接着…

爬虫案例——爬取腾讯社招

案例需求&#xff1a; 1.爬取腾讯社招的数据&#xff08;搜索 | 腾讯招聘&#xff09;包括岗位名称链接时间公司名称 2.爬取所有页&#xff08;翻页&#xff09; 3.利用jsonpath进行数据解析 4.保存数据&#xff1a;txt文本形式和excel文件两种形式 解析&#xff1a; 1.分…

9.16贪心算法

定义&#xff1a;贪心算法是一种逐步构建解决方案的算法&#xff0c;每次选择当前最优的局部解&#xff0c;期望通过局部最优解的累积&#xff0c;最终获得全局最优解​​​​​​典型例题&#xff1a; 1.找零问题--蓝桥云课 解决方案&#xff1a;先找大额&#xff0c;再找小额…

FreeRTOS学习笔记内置部分公司面试题目(更新中)

1. 简介 1.1 RTOS简介 RTOS(实时操作系统)是指一类系统&#xff0c;如 FreeRTOS&#xff0c;uC/OS&#xff0c;RTX&#xff0c;RT-Thread 等&#xff0c;都是 RTOS 类操作系统。 FreeRTOS 由美国的 Richard Barry 于 2003 年发布。 FreeRTOS 于 2017 年被亚马逊收购&#x…

【EXCEL数据处理】000022 案例 保姆级教程,附多个操作案例。EXCEL邮件合并工具

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000022 案例 保姆级教程&#xff0c;附多个操作案例。…

如何基于 RLHF 来优化 ChatGPT 类型的大语言模型

&#x1f6b4;前言 对于ChatGPT来说&#xff0c;RLHF是其训练的核心。所谓RLHF&#xff0c;即Reinforcement Learning with Human Feedback&#xff0c;基于人类反馈的强化学习。这项技术通过结合模型自身的生成能力和人类专家的反馈&#xff0c;为改进文本生成质量提供了新的…

云计算Openstack Horizon

OpenStack是一个开源的云计算平台&#xff0c;提供了构建和管理云计算环境所需的软件工具。而Horizon则是OpenStack的一个关键组件&#xff0c;它是基于Web的用户界面&#xff0c;为用户提供了一种直观、便捷的方式来管理和使用OpenStack资源。 一、技术原理 Horizon是一个基…

CloudStack计算节点配置

主机信息 CloudStack计算节点 任务1、计算节点基础环境准备 1)需要创建2张网卡&#xff01;&#xff01;&#xff01;】 2)VMware Workstation 中设置网卡模式为NAT&#xff0c;在“网络编辑器”中设置DHCP&#xff0c;网关设置为192.168.100.1&#xff0c;地址段为192.168.…

【记录】PPT|PPT 箭头相交怎么跨过

众所周知&#xff0c;在PPT中实现“跨线”效果并非直接可行&#xff0c;这一功能仅存在于Visio中。然而&#xff0c;通过一些巧妙的方法&#xff0c;我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法&#xff0c;而本文将介绍一种改进…