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

embedded/2024/12/23 3:02:04/

目录


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) / 2ret += 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.ppmy.cn/embedded/125003.html

相关文章

攻防世界----->Replace

前言&#xff1a;做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看&#xff1a; 没有任何反应&#xff1f; 猜测又是 地址随机化(ASLR)---遇见过。 操作参考&#xff1a; 攻防世界----&#xff1e;Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

【Spring】@RequestMapping、@RestController和Postman

文章目录 1.RequestMapping 注解介绍2. RequestMapping 使用3. RequestMapping 是 GET 还是 POST 请求&#xff1f;GET 请求POST 请求指定 GET/POST 方法类型 2. Postman 介绍1. 创建请求2. 传参介绍1. 普通传参2. form-data3. x-www-form-urlencoded4. raw 1.RequestMapping 注…

mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)

1、SQL 创建索引(CREATE INDEX 语句) 在SQL中&#xff0c;创建索引&#xff08;CREATE INDEX&#xff09;是一种用于提高数据库查询性能的方法。索引类似于书的目录&#xff0c;通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例&#xff0c;以及对其各部分的解释…

【数据结构】【顺序表算法】 删除特定范围内的元素

题目&#xff1a;从顺序表中删除其值在给定值s和t之间&#xff08;s<t&#xff09;的所有元素&#xff0c;若s或t不合理或顺序表为空&#xff0c;则显示错误信息并退出运行 bool Del_s_t(SqList &L,ElemType s,ElemType t){int i,k0;if(L.length0||s>t){return fals…

【Java】—— 数据结构与集合源码:数据结构概述与线性表、二叉树

1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 战术和策略&#xff1a;数据结构 上…

C++——string类

目录 前言&#xff1a; 一、C语言中字符串的缺陷 二、string常见接口极其调用 1.构造及遍历 2.、、[]、<<、>>运算符重载 3.string自身属性接口 4.增删查改接口 三、模拟实现 前言&#xff1a; 严格来说&#xff0c;string类并不属于STL中的一部分&#xf…

Linux 线程

目录 一.线程的概念 1.什么是线程&#xff1f; 2.Linux 系统对线程的实现 线程比进程要更轻量化体现在什么方面&#xff1f;&#xff1f; 线程切换较进程切换效率高的原因&#xff1f;&#xff1f; ①cache缓存&#xff08;主要原因&#xff09; ②寄存器的刷新&#xff…

Git管理远程仓库

添加远程仓库 要新增远程&#xff0c;请在终端上存储存储库的目录中使用 git remote add 命令。 git remote add 命令采用两个参数&#xff1a; 远程名称&#xff08;例如 origin&#xff09;远程 URL&#xff08;例如 https://github.com/OWNER/REPOSITORY.git&#xff09;…