算法沉淀——贪心算法七(leetcode真题剖析)

在这里插入图片描述

算法沉淀——贪心算法七

  • 01.整数替换
  • 02.俄罗斯套娃信封问题
  • 03.可被三整除的最大和
  • 04.距离相等的条形码
  • 05.重构字符串

01.整数替换

题目链接:https://leetcode.cn/problems/integer-replacement/

给定一个正整数 n ,你可以做如下操作:

  1. 如果 n 是偶数,则用 n / 2替换 n
  2. 如果 n 是奇数,则可以用 n + 1n - 1替换 n

返回 n 变为 1 所需的 最小替换次数

示例 1:

输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1

示例 2:

输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1

示例 3:

输入:n = 4
输出:2

提示:

  • 1 <= n <= 2^31 - 1

思路

这里我们要求得最小次数,要进行具体的分析讨论,首先偶数只有一种情况,所以不必讨论,若是奇数则分为一下三种情况:

1、n>1且n%3==1的时候,二进制位后是……01,最优的方式应该选择-1,这样就可以把末尾的1去掉
2、n>3且n%3==3的时候,二进制位后是……11,最优的方式应是选择+1,这样后续均为连续0,能够更快趋近1
3、n==3时,变成1最优操作数为2

代码

class Solution {
public:int integerReplacement(int n) {int ret=0;while(n>1){if(n%2==0){ret++;n/=2;}else{if(n==3){ret+=2;n=1;}else if(n%4==1){ret+=2;n/=2;}else{ret+=2;n=n/2+1;}}}return ret;}
};

02.俄罗斯套娃信封问题

题目链接:https://leetcode.cn/problems/russian-doll-envelopes/

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

示例 1:

输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

示例 2:

输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

提示:

  • 1 <= envelopes.length <= 105
  • envelopes[i].length == 2
  • 1 <= wi, hi <= 105

思路

重写排序+贪心+二分的思想:

我们先按照左端点不同时升序排序,左端点相同时按右端点降序排序,这样我们只需要考虑右端点,再使用贪心+二分就可以很好的解决这个问题

代码

class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) {sort(envelopes.begin(),envelopes.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(envelopes[0][1]);for(int i=1;i<envelopes.size();i++){int b=envelopes[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();}
};

03.可被三整除的最大和

题目链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/

给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。

示例 1:

输入:nums = [3,6,5,1,8]
输出:18
解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。

示例 2:

输入:nums = [4]
输出:0
解释:4 不能被 3 整除,所以无法选出数字,返回 0。

示例 3:

输入:nums = [1,2,3,4,4]
输出:12
解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。

提示:

  • 1 <= nums.length <= 4 * 10^4
  • 1 <= nums[i] <= 10^4

思路

首先我们先将所有的值累加起来,那么就会有下面三种情况

1、刚好是3的倍数,那么直接返回即可。
2、是3的倍数多1,那么我们找出除3的数中余1的最小的一个数,用总和减去与除3的数中余2的最小的两个数,找出最大值即为所需
3、是3的倍数多2,那么我们找出除3的数中余2的最小的一个数,用总和减去与除3的数中余1的最小的两个数,找出最大值即为所需

代码

class Solution {
public:int maxSumDivThree(vector<int>& nums) {const int INF=0x3f3f3f3f;int sum=0,x1=INF,x2=INF,y1=INF,y2=INF;for(int& x:nums){sum+=x;if(x%3==1){if(x<x1) x2=x1,x1=x;else if(x<x2) x2=x;}else if(x%3==2){if(x<y1) y2=y1,y1=x;else if(x<y2) y2=x;}}if(sum%3==0) return sum;else if(sum%3==1) return max(sum - x1,sum-y1-y2);else return max(sum-y1,sum-x1-x2);}
};

04.距离相等的条形码

题目链接:https://leetcode.cn/problems/distant-barcodes/

在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]

请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

示例 1:

输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]

示例 2:

输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]

提示:

  • 1 <= barcodes.length <= 10000
  • 1 <= barcodes[i] <= 10000

思路

首先题目要求保证存在答案,我们只需将出现次数最多的那个数两两相隔放置,剩下的数接着两两相隔放置即可,关于剩下的数为什么也可以直接两两放置,这是因为我们可以通过鸽巢定理推出只有出现最多的数才会影响到相隔,而我们解决了出现次数最大的数,所以剩下的数只要继续按照两两相隔的顺序继续放置即可。

代码

class Solution {
public:vector<int> rearrangeBarcodes(vector<int>& barcodes) {unordered_map<int,int> hash;int maxval=0,maxCount=0;for(int& x:barcodes){if(maxCount<++hash[x]){maxCount=hash[x];maxval=x;}}int n=barcodes.size(),index=0;vector<int> ret(n);for(int i=0;i<maxCount;i++){ret[index]=maxval;index+=2;}hash.erase(maxval);for(auto& [x,y]:hash){for(int i=0;i<y;i++){if(index>=n) index=1;ret[index]=x;index+=2;}}return ret;}
};

05.重构字符串

题目链接:https://leetcode.cn/problems/reorganize-string/

给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。

返回 s 的任意可能的重新排列。若不可行,返回空字符串 ""

示例 1:

输入: s = "aab"
输出: "aba"

示例 2:

输入: s = "aaab"
输出: ""

提示:

  • 1 <= s.length <= 500
  • s 只包含小写字母

思路

这一题和上一题思路基本一致,但需要注意的是,这一题并没有说一定有解,所以这里我们需要给出不符合的判断,其余代码类似上一题。

代码

class Solution {
public:string reorganizeString(string s) {int hash[26]={0};char maxChar=' ';int maxCount=0;for(char& ch:s){if(maxCount<++hash[ch-'a']){maxChar=ch;maxCount=hash[ch-'a'];}}int n=s.size();if(maxCount>(n+1)/2) return "";string ret(n,' ');int index=0;for(int i=0;i<maxCount;i++){ret[index]=maxChar;index+=2;}hash[maxChar-'a']=0;for(int i=0;i<26;i++){for(int j=0;j<hash[i];j++){if(index>=n) index=1;ret[index]='a'+i;index+=2;}}return ret;}
};

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

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

相关文章

数据结构:堆的创建和使用

上一期我们学习了树和二叉树的定义&#xff0c;其中我们了解到了两种特殊的二叉树&#xff1a;满二叉树和完全二叉树。 今天我们还要学习一种新的结构&#xff1a;堆 那这种结构和二叉树有什么联系呢&#xff1f;&#xff1f;&#xff1f; 通过观察我们可以发现&#xff0c;…

什么是通用人工智能(AGI)以及为什么它还没有到来:给AI爱好者的现实检查

人工智能通用智能(AGI)及其现状&#xff1a;AI爱好者的现实检验 引言 人工智能(AI)已经无处不在。从智能助手到自动驾驶汽车&#xff0c;AI系统正在改变我们的生活和商业。但是&#xff0c;如果有一种AI能够超越执行特定任务的能力呢&#xff1f;如果有一种AI能够像人类一样学…

pytorch之torch.save()和torch.load()方法详细说明

torch.save()和torch.load()是PyTorch中用于模型保存和加载的函数。它们提供了一种方便的方式来保存和恢复模型的状态、结构和参数。可以使用它们来保存和加载整个模型或其他任意的Python对象&#xff0c;并且可以在加载模型时指定目标设备。 1.语法介绍 1.1 torch.save()语法…

uni-app开发---4.首页

一、创建 home 分支 运行如下的命令&#xff0c;基于 master 分支在本地创建 home 子分支&#xff0c;用来开发和 home 首页相关的功能&#xff1a; git checkout -b home 二、配置网络请求 由于平台的限制&#xff0c;小程序项目中不支持 axios&#xff0c;而且原生…

ARM-UART实验

串口控制三盏灯亮灭 视频 串口实验验证.mp4 代码 uart4.c #include "uart4.h"void uart4_init() {//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR | (0x1<<1);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<6);//GPIOGRCC->MP_APB1ENSETR | (0X…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…

SOCKS5代理、代理IP、HTTP与网络安全的融合之旅

在数字化世界的无边网络海洋中&#xff0c;数据以难以想象的速度流动&#xff0c;连接着世界的每一个角落。作为一名软件工程师&#xff0c;深入理解网络通信的基石——SOCKS5代理、代理IP、HTTP协议&#xff0c;并掌握这些技术在网络安全中的应用&#xff0c;是航行于这片海洋…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能&#xff0c;我们通常会通过应用系统采集用户的个人简历信息…

android recyclerview 总结

面试官问我熟不熟 recyclerview&#xff0c;我说不熟 他就没再继续问&#xff0c;整个过程还是比较丝滑的 呵呵&#xff1f;&#xff1f;这么一个基础控件&#xff0c;你居然敢说不熟&#xff0c;真没想到 1 recyclerview相比listview的区别 1.1 ViewHolder 的编写规范化了 …

云主机搭建与服务软件部署

文章目录 登录访问云电脑与云电脑传输文件配置ssh服务ssh连接云电脑使用scp传输文件云端服务软件部署与实现外部访问首先购买云主机,以阿里云服务器 ECS为例子,官网购买就行了,选择默认安装了windows server 2022服务器系统 登录访问云电脑 购买完成进入控制台,能看到创建…

蓝桥杯第十三届蓝桥杯大赛软件赛决赛CC++ 研究生组之选素数

蓝桥杯第十三届蓝桥杯大赛软件赛决赛C/C 研究生组之选素数 [题目传送门](0选素数 - 蓝桥云课 (lanqiao.cn)) 问题大意&#xff1a; 小蓝有一个数字&#xff0c;要进行如下操作&#xff1a; 首先选出一个小于x 的质数p&#xff0c;然后将x变成要比原本大的最小的为p的倍数的…

js判断字符串是否为JSON格式

使用场景&#xff1a;在有些项目中我们会将用户输入的JSON字符串转化为对象形式并展示出来&#xff0c;那么首先我们就要判断一个字符串是否为一个合法的JSON字符串。 代码如下&#xff1a; isJSON(str) { if (typeof str string) { try { let obj …

使用CUDA 为Tegra构建OpenCV

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 下一篇&#xff1a;在iOS中安装 警告&#xff1a; 本教程可能包含过时的信息。 使用CUDA for Tegra 的OpenCV 本文档是构建支持 CUD…

谷歌具身智能最新进展:RT-H 机器人通用灵巧抓取

随着 GPT-4 等大型语言模型与机器人研究的结合愈发紧密&#xff0c;人工智能正在越来越多地走向现实世界&#xff0c;因此具身智能相关的研究也正受到越来越多的关注。在众多研究项目中&#xff0c;谷歌的「RT」系列机器人始终走在前沿&#xff08;参见《大模型正在重构机器人&…

各位老板,你需要的工厂数字孪生可视化库在这

各位老板是不是很喜欢下面这种有逼格的大屏,下面介绍一下怎么实现的,保证有所收获。 Cesium是一个开源的WebGL JavaScript库&#xff0c;用于创建高性能的三维地球、地图和虚拟环境。它支持在浏览器中实现高质量的地球模拟&#xff0c;同时提供了丰富的功能特点&#xff0c;使得…

Superset二次开发之PostgreSQL 统计信息介绍

pg_stat_user_tables 视图提供了关于 PostgreSQL 数据库中用户定义表的统计信息。这些统计信息涵盖了从表的扫描操作到修改次数等多个方面。 以下是 pg_stat_user_tables 中所有字段的含义&#xff1a; relid: 表的 OID&#xff08;对象标识符&#xff09;。这是表在系统中的…

k8s系列之十五 Istio 部署Bookinfo 应用

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖&#xff0c;但是构成了一个有代表性的服务网格的例子&#xff1a;它由多个服务、多个语言构成&#xff0c;并且 reviews 服务具有多个版本。 该应用由四个单独的微服务构成。 这个应用模仿在线书…

模板高级使用(非类型模板参数,特化,分离编译)

文章目录 模板没有实例化取内嵌类型报错问题非类型模板参数模板的特化函数模板的特化类模板的特化1.全特化2.偏特化 模板的分离编译 模板没有实例化取内嵌类型报错问题 首先在这里分享一个模板的常见报错问题。就是模板的在没有实例化的情况下去取模板类里面的内嵌类型这时候的…

代码随想录|Day25|回溯05|491.非递减子序列、46.全排列、47.全排列II

491. 非递减子序列 本题并不能像 90.子集II 那样&#xff0c;使用排序进行树层去重。虽然题目没有明确不能排序&#xff0c;但如果排序了&#xff0c;集合本身就是递增子序列&#xff0c;这是LeetCode示例2中没有出现的。 所以本题的关键在于&#xff0c;如何在不排序的情况下对…

引入spring security 403问题

禁用 csrf 即可 httpSecurity.csrf(csrf -> csrf.disable()); Configuration public class SecurityConfig {/*** 认证管理器** param authenticationConfiguration* return* throws Exception*/Beanpublic AuthenticationManager authenticationManager(AuthenticationConf…