LeetCode---121双周赛---数位dp

题目列表

2996. 大于等于顺序前缀和的最小缺失整数

2997. 使数组异或和等于 K 的最少操作次数

2998. 使 X 和 Y 相等的最少操作次数

2999. 统计强大整数的数目

一、大于等于顺序前缀和的最小缺失整数

简单的模拟题,只要按照题目的要求去写代码即可,代码如下

class Solution {
public:
    int missingInteger(vector<int>& nums) {
        int i=1,ans=nums[0],n=nums.size();
        while(i<n){
            if(nums[i]-nums[i-1]!=1)
                break;
            ans+=nums[i];
            i++;
        }
        unordered_set<int>s(nums.begin(),nums.end());
        while(s.count(ans))
            ans++;
        return ans;
    }
};

二、使数组异或和为K的最小操作次数

这题考异或的性质---相同为0,相异为1,我们只要关心nums的异或和与K的二进制位有几个不同即可,也就是将k和nums一起异或,最后看二进制位上还有几个1

(这里可能有人还是很懵,简单说一下思路的正确性,异或运算的性质决定了它不会干扰到其他位,我们可以把异或运算看作是每个二进制位的单独的运算且满足交换律,现在我们单独看某一个二进制位,如果共有3个1,2个0异或,那么异或结果为1,如果我们将其中的一个1换成0或者将一个0换成1,异或的结果就会改变,至于被修改的是哪个数字的二进制位无所谓都行,所以二进制位的单一位,只需进行一次操作就能发生改变,所以我们的答案如上诉所说)

代码如下

class Solution {
public:
    int minOperations(vector<int>& nums, int k) {
        for(auto&e:nums)
            k^=e;
        return __builtin_popcount(k);//求二进制位上的1的个数
    }
};

三、使X和Y相等的最小操作次数

这题有两种思路,都给大家讲一讲,在讲思路之前,我们都应该能观察得到,当x<=y时,我们只能用+1操作,即操作个数一定为y-x,也就是说我们只要考虑x>y的情况

思路一:图的bfs

我们将x->y过程中经过的每个数看作是图上的结点,然后我们用层序遍历的思路一层层往外遍历,直到我们找到y,返回结果,因为我们的操作次数是累加的,所以第一次找到y时我们一定能得到最小的操作次数(不代表层序遍历的次数就是最小操作次数,也可能出现操作后的数小于y,然后通过+1操作实现=y的情况,具体看代码)。这个思路的关键是你能想到它能用图来类比,从而想到层序遍历,当然实现细节还是很多的。

(启发:图的遍历不是只有图能用,像这种抽象的,从一个"点"到另一个"点",且中间经过的"点"是确定的,然后要求最小操作次数,就可以往图的层序遍历去思考)

代码如下

class Solution {
public:
    int minimumOperationsToMakeEqual(int x, int y) {
        if(x<=y)
            return y-x;
        int ans=x-y;//代表操作上限(只用减法)
        //ans+x是在操作上限的范围内只做加法操作的最大数字,+1是因为下标
        vector<bool>vis(ans+x+1);//记录遍历到的结点,能减少重复数字的遍历次数
        int step=0;

        vector<int>q;
        auto add=[&](int v){
            if(v<y)
                ans=min(ans,step+1+y-v);
            else if(!vis[v]){
                vis[v]=true;
                q.push_back(v);
            }
        };

        add(x);
        while(1){
            auto tmp=q;
            q.clear();
            for(auto v:tmp){
                if(v==y)
                    return min(ans,step);
                if(v%5==0)
                    add(v/5);
                if(v%11==0)
                    add(v/11);
                add(v-1);
                add(v+1);
            }
            step++;
        }
    }
};

思路二:记忆化搜索

首先我们要对递归有一个大体的方向,由于我们只考虑x>y的情况,所以要求操作次数最少,我们肯定希望尽可能的用/5 、/11,让x能快速的接近y,即我们将加减1当作辅助操作,同时还要考虑到只用减法操作得到最小操作次数的情况。

我们根据题意,确定递归的参数和返回值,dfs(v)返回从v到y的最小操作次数

接下来我们来想想如何从v->y

1、v<=y,只能进行+1操作,操作次数为v-y,直接返回

2、v>y

1)只用减法操作,操作次数为v-y

2)用/5操作,两种可能,进行v%5次减法操作,或者进行5-v%5次加法操作,让v变成5的倍数后/5,操作次数为min(dfs(v/5)+v%5,dfs(v/5+1)+5-v%5)+1,+1是因为/5也要算操作次数

3)用/11操作,两种可能,进行v%11次减法操作,或者进行11-v%11次加法操作,让v变成11的倍数后/11,操作次数为min(dfs(v/11)+v%11,dfs(v/11+1)+11-v%11)+1

返回三者的最小值

对于v>y的后两种情况,我们是根据红字部分得来的,其实并不严谨,因为我们没有证明,v到它前后最近的5的倍数是最优解,即它再+5/-5得到的另一个5的倍数是否会更好?这个其实很好想,+5/-5的操作次数导致的结果就是/5之后的数字相差了一个1,那么我先/5后再+1/-1,不是能更快得到结果嘛(11同理),所以我们只考虑v前后的5的倍数即可,代码如下

class Solution {
public:
    int minimumOperationsToMakeEqual(int x, int y) {
        if(x<=y)
            return y-x;
        int memo[x+1];
        memset(memo,-1,sizeof(memo));
        function<int(int)>dfs=[&](int v)->int{
            if(v<=y)
                return y-v;
            if(memo[v]!=-1) return memo[v];
            int res=v-y;
            res=min(res,min(dfs(v/5)+v%5,dfs(v/5+1)+5-v%5)+1);
            res=min(res,min(dfs(v/11)+v%11,dfs(v/11+1)+11-v%11)+1);
            return memo[v]=res;
        };
        return dfs(x);
    }
};

 四、统计强大整数的数目

这题很典型的数位dp题,要求我们返回在所给范围内的满足条件的数字个数。数位dp的思路就是考虑如何构造出这样一个符合要求的数字,我们一位一位的考虑即可。

代码如下

class Solution {
    typedef long long LL;
public:
    long long numberOfPowerfulInt(long long start, long long finish, int limit, string s) {
        //将数字区间端点变成字符串
        string left=to_string(start);
        string right=to_string(finish);
        int n=right.size();
        left=string(n-left.size(),'0')+left;//补上前导零,方便后面的计算
        int diff=n-s.size();

        //记忆化搜索
        vector<LL>memo(n,-1);
        function<LL(int,bool,bool)>dfs=[&](int i,bool limit_low,bool limit_high)->LL{
            if(i==n)//递归到这,说明构造的数字合法,返回1
                return 1;
            if(!limit_high&&!limit_low&&memo[i]!=-1) //这个是因为限制高/限低在递归中只会走一次,没有必要进行记忆化,所以记忆数组可以是一维的
                return memo[i];

            //求当前位置的数的取值范围
            int high=limit_high?right[i]-'0':9;
            int low=limit_low?left[i]-'0':0;
            LL res=0;
            
            //根据题目的其他限制条件,进行递归
            if(i<diff)
                for(int d=low;d<=min(high,limit);d++)
                    res+=dfs(i+1,d==low&&limit_low,d==high&&limit_high);
            else{
                int d=s[i-diff]-'0';
                if(d>=low&&d<=min(high,limit))
                    res=dfs(i+1,d==low&&limit_low,d==high&&limit_high);
            }
            if(!limit_high&&!limit_low)
                memo[i]=res;
            return res;
        };

        return dfs(0,true,true);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级分布式系统-第6讲 分布式系统的容错性--进程的容错

分布式系统的容错原则既适用于硬件&#xff0c; 也适用于软件。 两者的主要区别在于硬件部件的同类复制相对容易&#xff0c; 而软件组件在运行中的同类复制&#xff08; 进程复制&#xff09; 涉及到更为复杂的分布式操作系统的容错机制。 以下是建立进程失效容错机制的一些基…

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

css3基础语法与盒模型

css3基础语法与盒模型 前言CSS3基础入门css3的书写位置内嵌式外链式导入式&#xff08;工作中几乎不用&#xff09;行内式 css3基本语法css3选择器标签选择器id选择器class类名原子类复合选择器伪类元素关系选择器序号选择器属性选择器css3新增伪类![在这里插入图片描述](https…

AI教我学编程之C#类型

前言 在上一课 中我们通过C#入门程序了解到关于C#的基础知识&#xff0c;这节课我们来感受作为C家族最大的黑马&#xff0c;在TIOBE榜单 上受欢迎程度未来两个月可能超越java的存在&#xff1a;C#的魅力 重点先知 1、C#程序或DLL的源代码是一组类型声明。 2、对于可执行程序&…

高压消防泵:科技与安全性的完美结合

在现代社会&#xff0c;随着科技的不断发展&#xff0c;各种高科技设备层出不穷&#xff0c;为我们的生活带来了极大的便利。在森林火灾扑救领域&#xff0c;恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备&#xff0c;将科技与安全性完美地结合在一起…

【面试突击】注册中心面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

uniapp 如何使用echarts 以及解决tooltip自定义不生效问题

使用的是echarts-for-wx插件&#xff1b; 正常写法案例&#xff1a;给tooltip数值加个% <template><view><uni-ec-canvas class"uni-ec-canvas"id"uni-ec-canvas"ref"canvas"canvas-id"uni-ec-canvas":ec"ec&quo…

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

TSP问题 旅行商问题&#xff08;Travelling Salesman Problem, 简记TSP&#xff0c;亦称货郎担问题)&#xff1a;设有n个城市和距离矩阵D [dij]&#xff0c;其中dij表示城市i到城市j的距离&#xff0c;i, j 1, 2 … n&#xff0c;则问题是要找出遍访每个城市恰好一次的一条回…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间&#xff0c;把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…

使用Sqoop将数据从Hadoop导出到关系型数据库

当将数据从Hadoop导出到关系型数据库时&#xff0c;Apache Sqoop是一个非常有用的工具。Sqoop可以轻松地将大数据存储中的数据导出到常见的关系型数据库&#xff0c;如MySQL、Oracle、SQL Server等。本文将深入介绍如何使用Sqoop进行数据导出&#xff0c;并提供详细的示例代码&…

Leetcode10035. 对角线最长的矩形的面积

Every day a Leetcode 题目来源&#xff1a;10035. 对角线最长的矩形的面积 解法1&#xff1a;模拟 给你一个下标从 0 开始的二维整数数组 dimensions。 对于所有下标 i&#xff08;0 < i < dimensions.length&#xff09;&#xff0c;dimensions[i][0] 表示矩形 i …

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

android studio设置gradle和gradle JDK版本

文章目录 1.gradle JDK版本2.gradle版本 1.gradle JDK版本 file -> project structure -> SDK Location -> Gradle Settings -> Gradle JDK -> Download JDK 2.gradle版本 file -> project structure -> Project

在线海报图片设计器、图片编辑器,仿照稿定设计

源码介绍 在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器&#xff0c;仿照稿定设计而成。该系统适用于多种场景&#xff0c;包括海报图片生成、电商分享图、文章长图、视频/公众号封面等。用户无需下载软件&#xff0c;即可轻松实现创意&#xff0c;迅…

redis夯实之路-哨兵(Sentinel)机制详解

Sentinel&#xff08;哨兵&#xff09;保证了redis的高可用性&#xff0c;一个Sentinel或多个Sentinel组成的系统监视多个主从服务器&#xff0c;当主服务器下线时&#xff0c;自动将一个从服务器升级为主服务器。 sentinel的主要功能 集群监控&#xff1a;负责监控redis mas…

UG装配-多运动组合动画与自动创建装配路径

当圆盘在装配过程中既有旋转运动&#xff0c;又有直线运动的时候&#xff0c;我们需要用到序列中的抽取路径 抽取路径命令在如下位置&#xff0c;需要注意的是&#xff0c;使用抽取路径前&#xff0c;如果有其他零件与所取对象配合&#xff0c;需要先物体脱离或使用拆卸对其脱离…

基于Hadoop的网上购物行为大数据分析及预测系统【flask+echarts+机器学习】前后端交互

有需要本项目或者部署的系统可以私信博主&#xff0c;提供远程部署和讲解 本研究基于淘宝用户行为的开源数据展开大数据分析研究&#xff0c;通过Hadoop大数据分析平台对阿里天池公开的开源数据集进行多维度的用户行为分析&#xff0c;为电商销售提供可行性决策。 首先我们将大…

Java LeetCode刷题 单调栈

单调栈 单调栈概念 每日温度 单调栈 概念 单调栈&#xff08;Monotonic Stack&#xff09;是一个特殊的数据结构&#xff0c;它是一种栈&#xff0c;但具有单调性的特性。单调栈有两种类型&#xff1a;单调递增栈和单调递减栈。 在单调递增栈中&#xff0c;栈内的元素保持递…

【JAVA】谈谈 ReadWriteLock 和 StampedLock

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 ReadWriteLock&#xff08;读写锁&#xff09; 基本原理&#xff1a; 接口和实现&#xff1a; 用法示例&#xff1a; StampedL…