当前位置: 首页 > news >正文

【LeetCode】3524. 求出数组的 X 值 I (动态规划)

3524. 求出数组的 X 值 I - 力扣(LeetCode)

题目:

思路:

简单题,学习到了处理子数组问题的一般思路

对于本题,如果我们暴力枚举显然是 O(N²) 的,所以考虑优化

注意到题目中的 k 很小,我们不妨考虑使用动态规划求解

在面对子数组问题时,我们通用思路是转变为 “计算 以 i 结尾的符合要求的子数组 的数量”,这样我们就能通过递推的方式来将时间复杂度优化掉

本题我们一样,我们定义 f[i][j] 是以 i 结尾,且余数为 j 的子数组的数量,那么考虑转移

①.不接上前面,由于我们可以只选自身,那么就有 f[i][nums[i] % k]++

②.接上前面,此时接上了前面我们该如何计算呢?

既然接上了前面,那么新的余数显然就是 x * nums[i] % k,然后转移即可

但是我们发现如果按照通常枚举 f[i][j] 的 j 是不好计算的,因为 j = x * nums[i] % k,对于枚举的 j 我们不好求出转移来的 x,所以我们这里将枚举 f[i-1][j] 的 j,即反向求出转移的目的地,那么代码就是 f[i][j * nums[i] % k] += f[i-1][j]

至此结束,注意点为下标处理,这里填充一个无用元素将下标后移,同时注意开long long,转移过程不能爆 int

代码:

class Solution {
public:vector<long long> resultArray(vector<int>& nums, int k) {int n = nums.size();nums.insert(nums.begin(), 0);vector<vector<long long>> f(n + 1, vector<long long>(k, 0));for (int i = 1; i <= n; i++) {f[i][nums[i] % k]++;for (int j = 0; j < k; j++) {f[i][(1LL*j*nums[i])%k] += f[i-1][j];}}vector<long long> ans(k, 0);for (int i = 1; i <= n; i++) {for (int j = 0; j < k; j++) {ans[j] += f[i][j];}}return ans;}
};

http://www.dtcms.com/a/360711.html

相关文章:

  • 【LeetCode 155】—最小栈 - 详解与实现
  • 阿里Qoder怎么样?实测对比TRAE SOLO 和 CodeBuddy IDE
  • 保健品跨境电商:如何筑牢产品质量与安全防线?
  • 数据库事务隔离级别与 MVCC 机制详解
  • 机器学习(四)KNN算法-分类
  • 哈希表-1.两数之和-力扣(LeetCode)
  • git将当前分支推送到远端指定分支
  • YOLO 目标检测:YOLOv3网络结构、特征输出、FPN、多尺度预测
  • Redis--Lua脚本以及在SpringBoot中的使用
  • 三、Gitee平台使用指南
  • 第 94 场周赛:叶子相似的树、模拟行走机器人、爱吃香蕉的珂珂、最长的斐波那契子序列的长度
  • Eclipse Compiler for Java (ECJ):安装指南与高效快捷键全解析
  • 构建无广告私人图书馆Reader与cpolar让电子书库随身携带
  • 鸿蒙总改变字体大小设置
  • 【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!
  • 深度学习框架与工具使用心得:从入门到实战优化
  • Unity核心概念③:Inspector窗口可编辑变量
  • 电科金仓 KFS 场景化实践路径解析:从行业场景落地看技术价值转化
  • JP4-1-MyLesson项目简介
  • 掌握正则表达式与文本处理:提升 Shell 编程效率的关键技巧
  • Go 语言 sync 包解析
  • [React]监听Form中某个字段的变化
  • vue2》》Computed、Watch
  • 【Vue2 ✨】Vue2 入门之旅(四):生命周期钩子
  • Git从零到远程协作:手把手实战指南
  • C 语言进程通信之信号API
  • [线上问题排查]1.数据库死锁全解析与解决方案
  • 算法:插入排序
  • LeetCode 刷题【58. 最后一个单词的长度、59. 螺旋矩阵 II】
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案