【力扣周赛】第 111 场双周赛(状态机数位DP)⭐

news2024/12/26 12:06:26

文章目录

比赛链接

https://leetcode.cn/contest/biweekly-contest-111

Q1:6954. 统计和小于目标的下标对数目

https://leetcode.cn/problems/count-pairs-whose-sum-is-less-than-target/
在这里插入图片描述

提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50

解法1—— O ( n 2 ) O(n^2) O(n2)暴力

class Solution {
    public int countPairs(List<Integer> nums, int target) {
        int ans = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums.get(i) + nums.get(j) < target) ans++;
            }
        }
        return ans;
    }
}

解法2——排序+双指针 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

排序之后使用双向双指针,

class Solution {
    public int countPairs(List<Integer> nums, int target) {
        Collections.sort(nums);
        int ans = 0, l = 0, r = nums.size() - 1;
        while (l < r) {
            if (nums.get(l) + nums.get(r) < target) {
                ans += r - l;
                l++;
            } else r--;
        }
        return ans;
    }
}

Q2:8014. 循环增长使字符串子序列等于另一个字符串

https://leetcode.cn/problems/make-string-a-subsequence-using-cyclic-increments/

在这里插入图片描述
提示:
1 <= str1.length <= 10^5
1 <= str2.length <= 10^5
str1 和 str2 只包含小写英文字母。

双指针

其实就是双指针判断子序列那道题目,除了可以相同匹配外,还可以循环+1后匹配。

class Solution {
    public boolean canMakeSubsequence(String s1, String s2) {
        int m = s1.length(), n = s2.length();
        int i = 0, j = 0;
        while (i < m && j < n) {
            // 如果可以匹配上
            if (s1.charAt(i) == s2.charAt(j) || (s1.charAt(i) + 1 - 'a') % 26 == (s2.charAt(j) - 'a') % 26) ++j;
            ++i;
        }
        return j == n;
    }
}

相似题目——392. 判断子序列

https://leetcode.cn/problems/is-subsequence/description/

在这里插入图片描述

class Solution {
    public boolean isSubsequence(String s, String t) {
        int n1 = s.length(), n2 = t.length();
        int i = 0, j = 0;
        while (i < n1 && j < n2) {
            if (s.charAt(i) == t.charAt(j)) i++;
            j++;
        }
        return i == n1;
    }
}

Q3:6941. 将三个组排序

https://leetcode.cn/problems/sorting-three-groups/
在这里插入图片描述

提示:
1 <= nums.length <= 100
1 <= nums[i] <= 3

解法1——转化成最长非递减子序列

转换成最多可以保留多少个元素不变,这些保留的元素必须是非递减的。
那么答案就是除了这些保留的元素之外需要被删去的元素数量。

代码1—— O ( n 2 ) O(n^2) O(n2)dp

class Solution {
    public int minimumOperations(List<Integer> nums) {
        int n = nums.size(), ans = 0;
        int[] dp = new int[n];
        for (int i = 0; i < n; ++i) {
            dp[i] = 1;
            for (int j = 0; j < i; ++j) {
                if (nums.get(i) >= nums.get(j)) dp[i] = Math.max(dp[i], dp[j] + 1);
            }
            ans = Math.max(ans, dp[i]);
        }
        return n - ans;
    }
}

代码2——二分写法(更快 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

class Solution {
    public int minimumOperations(List<Integer> nums) {
        int n = nums.size();
        List<Integer> g = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            int l = 0, r = g.size();
            while (l < r) {
                int mid = l + r >> 1;
                if (g.get(mid) <= nums.get(i)) l = mid + 1;
                else r = mid;
            }
            if (l == g.size()) g.add(nums.get(i));
            else g.set(l, nums.get(i));
        }
        return n - g.size();
    }
}

解法2——状态机DP

定义 f[i+1][j] 表示考虑 nums[0] 到 nums[i],且 nums[i] 变成 j 的最小修改次数。

class Solution {
    public int minimumOperations(List<Integer> nums) {
        int n = nums.size();
        int[][] dp = new int[n + 1][4];
        for (int i = 1; i <= n; ++i) {
            // 从0~i,且nums[i]变成j
            for (int j = 1; j <= 3; ++j) {
                dp[i][j] = dp[i - 1][j];
                // 枚举第 i-1 个数字变成了 k
                for (int k = 1; k < j; ++k) {
                    dp[i][j] = Math.min(dp[i][j], dp[i - 1][k]);
                }
                if (j != nums.get(i - 1)) dp[i][j]++;
            }
        }
        int ans = n;
        for (int j = 1; j <= 3; ++j) {
            ans = Math.min(ans, dp[n][j]);
        }
        return ans;
    }
}

Q4:8013. 范围中美丽整数的数目(数位DP)⭐⭐⭐⭐⭐

https://leetcode.cn/problems/number-of-beautiful-integers-in-the-range/

在这里插入图片描述
提示:
0 < low <= high <= 10^9
0 < k <= 20

更多关于数位DP可见:
【算法】数位DP
【算法基础:动态规划】5.4 数位统计DP(计数问题)(数位DP)

解法

在这里插入图片描述

代码如下:

class Solution {
    int[][][] memo;
    char[] s;
    int m, k;

    public int numberOfBeautifulIntegers(int low, int high, int k) {
        this.k = k;
        return op(high) - op(low - 1);
    }

    public int op(int n) {
        s = Integer.toString(n).toCharArray();
        m = s.length;
        memo = new int[m][k][m * 2 + 1];
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < k; ++j) {
                Arrays.fill(memo[i][j], -1);
            }
        }
        return dfs(0, true, false, 0, m);
    }

    public int dfs(int i, boolean isLimit, boolean isNum, int val, int diff) {
        if (i == s.length) return isNum && val == 0 && diff == m? 1: 0;
        if (!isLimit && isNum && memo[i][val][diff] != -1) return memo[i][val][diff];

        int res = 0;
        if (!isNum) res = dfs(i + 1, false, false, 0, m);
        int up = isLimit? s[i] - '0': 9;
        for (int d = isNum? 0: 1; d <= up; ++d) {
            res += dfs(i + 1, isLimit && d == up, true, (val * 10 + d) % k, diff + d % 2 * 2 - 1);
        }
        if (!isLimit && isNum) memo[i][val][diff] = res;
        return res;
    }
}

使用到的技巧

判断这个数可以被 k 整除

由于是从前往后的,也就是从高位到低位,所以每次执行 (val * 10 + d) % k

判断奇数数位和偶数数位的数量之差

使用 diff 记录两者的数量之差,初始设置为 m,原因是作为数组的下标不能出现负数。
每次执行 diff + d % 2 * 2 - 1) ,这样如果 d 是奇数就会 + 1,否则就会 - 1。

成绩记录

在这里插入图片描述
就是很垃圾的成绩了。。。

在这里插入图片描述

参考资料

[第111场双周赛]式酱的解题报告

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

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

相关文章

数据结构--树4.1

目录 一、树的定义 二、结点的分类 三、结点间的关系 四、结点的层次 五、树的存储结构 一、树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。当n0时称为空树&#xff0c;在任意一个非空树中&#xff1a; ——有且仅有一个特定的…

Cesium常用功能封装,js编码,每个功能独立封装——第1篇

Cesium常用功能封装&#xff0c;js编码&#xff0c;每个功能独立封装&#xff0c;方便直接应用到项目中。 本脚手架项目是前后端一整套&#xff0c;包括权限管理。前端框架采用Vue3 js ElementUI-Plus&#xff0c;后端采用Spring Boot Mysql Redis&#xff0c;GIS引擎本项目…

深度学习技术

深度学习是什么&#xff1f; 深度学习&#xff0c;英文名为Deep Learning&#xff0c;其实就是机器学习的一种高级形式。它的灵感来源于人脑神经网络的工作方式&#xff0c;是一种让机器可以自主地从数据中学习和提取特征的技术。你可以把它想象成一位小侦探&#xff0c;通过不…

springboot+vue健身器材用品网上商城系统的设计与实现_97794

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决各种问题&#xff0c;必录德健身器材用品网展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

Leetcode 191.位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

帆软报表系统获取管理员权限

子曰&#xff1a;“君子食无求饱&#xff0c;居无求安&#xff0c;敏于事而慎于言&#xff0c;就有道而正焉&#xff1a;可谓好学也已。” 漏洞实战 构造payload&#xff0c;访问漏洞url后台地址&#xff1a; /ReportServer?opfr_auth&cmdah_loginui&_161983254558…

一个短视频去水印小程序,附源码

闲来无事&#xff0c;开发了一个短视频去水印小程序&#xff0c;目前支持抖音、快手&#xff0c;后续再加上别的平台。 因为平台原因&#xff0c;就不放二维码了&#xff0c;你可以直接微信搜索【万能老助手】这里贴一张效果图。 页面非常简单&#xff0c;这里就不过多介绍了&…

node.js安装好后测试报错解决

node.js的版本是18.X.X node.js安装好后&#xff0c;执行命令&#xff1a; npm install express -g 报错&#xff01;&#xff01;&#xff01; 解决办法&#xff1a; 看报错是由于权限不够&#xff0c; 所以打开cmd时&#xff0c;以管理员的方式打开 然后再执行命令就OK了…

LLMs:LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略

LLMs&#xff1a;LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略 目录 LangChain-Chatchat的简介 1、原理图解 2、文档处理实现流程 1、模型支持 (1)、LLM 模型支持 (2)、Embedding 模型支持 LangChain-Chatchat的安装 1、镜像部署…

nacos总结1

5.Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 5.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c…

记一种不错的缓存设计思路

之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路&#xff0c;觉得不错&#xff0c;做个记录供以后参考。 场景 假设有个以下格式的接口&#xff1a; GET /api?keys{key1,key2,key3,...}&types{1,2,3,...} 其中 keys 是业务主键列表&#xff0c;types 是想要取到的…

原生微信小程序 动态(横向,纵向)公告(广告)栏

先看一下动态效果 Y轴滚动公告的原理是swiper组件在页面中的Y轴滚动&#xff0c;属性vertical&#xff0c;其余属性也设置一下autoplay circular interval"3000" X轴滚动的原理是&#xff0c;利用动画效果&#xff0c;将内容从右往左过渡过去 wxml&#xff1a; &l…

80%的攻击仅使用三个恶意软件加载程序

根据 IT 安全公司 ReliaQuest 的威胁研究人员的说法&#xff0c;QakBot、SocGholish 和 Raspberry Robin 这三种恶意软件加载程序在 80% 的事件中造成了严重破坏。 恶意软件加载程序用作传递和执行其他形式恶意软件的工具&#xff0c;例如勒索软件、病毒、木马或蠕虫。它们是攻…

Android SDK 上手指南||第八章 应用程序资源

第八章 应用程序资源 在系列教程中的最新一篇里&#xff0c;我们将研究大家最可能在第一个开发项目中涉及到的资源类型。项目资源当中包含布局、图片以及数据值&#xff0c;这些都是应用需要使用的元素。当我们创建一个新项目时&#xff0c;项目目录下会自动生成多个用于容纳通…

[管理与领导-53]:IT基层管理者 - 8项核心技能 - 8 - 持续改进

前言&#xff1a; 管理者存在的价值就是制定目标&#xff0c;即目标管理、通过团队&#xff08;他人&#xff09;拿到结果。 要想通过他人拿到结果&#xff1a; &#xff08;1&#xff09;目标&#xff1a;制定符合SMART原则的符合业务需求的目标&#xff0c;团队跳一跳就可以…

飞腾uboot命令简单介绍

飞腾uboot和开源uboot并无大差异,故飞腾uboot固件命令可以直接从网上搜索开源uboot相关命令。 这里为了便于大家调试,将一些可能用到的命令说明一下。 在 Uboot 命令行下,输入 help 将打印所有的可用命令,复杂命令操作,通过命令 help 的方式获取具体说明。 1.help命令 …

GDB用法(一)

预备 测试代码 main.cpp #include <iostream> #include <vector> #include "student.h"using namespace std;int add(int a, int b) {return a b; }int main() {vector<int> v {1, 3};Student* s1 new Student("zz", 20);Student* …

如何评估一个需求开发通常需要多长时间?

业务人员和产品管理者有时候会想要知道在他们即将进行的项目中&#xff0c;“处理需求”的环节会花费多长时间。但这个问题并没有固定的答案&#xff0c;因为这会取决于很多因素。 有许多已经公开的行业平均数据可以提供参考&#xff0c;它可以提示我们在一个典型项目中应该花…

本质矩阵E推R和T

https://zhuanlan.zhihu.com/p/500798616 https://zhuanlan.zhihu.com/p/435306687