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

leetcode2025. 分割数组的最多方案数-hard

1 题目:分割数组的最多方案数

官方标定难度:难

给你一个下标从 0 开始且长度为 n 的整数数组 nums 。分割 数组 nums 的方案数定义为符合以下两个条件的 pivot 数目:

1 <= pivot < n
nums[0] + nums[1] + … + nums[pivot - 1] == nums[pivot] + nums[pivot + 1] + … + nums[n - 1]
同时给你一个整数 k 。你可以将 nums 中 一个 元素变为 k 或 不改变 数组。

请你返回在 至多 改变一个元素的前提下,最多 有多少种方法 分割 nums 使得上述两个条件都满足。

示例 1:

输入:nums = [2,-1,2], k = 3
输出:1
解释:一个最优的方案是将 nums[0] 改为 k 。数组变为 [3,-1,2] 。
有一种方法分割数组:

  • pivot = 2 ,我们有分割 [3,-1 | 2]:3 + -1 == 2 。

示例 2:

输入:nums = [0,0,0], k = 1
输出:2
解释:一个最优的方案是不改动数组。
有两种方法分割数组:

  • pivot = 1 ,我们有分割 [0 | 0,0]:0 == 0 + 0 。
  • pivot = 2 ,我们有分割 [0,0 | 0]: 0 + 0 == 0 。

示例 3:

输入:nums = [22,4,-25,-20,-15,15,-16,7,19,-10,0,-13,-14], k = -33
输出:4
解释:一个最优的方案是将 nums[2] 改为 k 。数组变为 [22,4,-33,-20,-15,15,-16,7,19,-10,0,-13,-14] 。
有四种方法分割数组。

提示:

n == nums.length
2 < = n < = 1 0 5 2 <= n <= 10^5 2<=n<=105
− 1 0 5 < = k , n u m s [ i ] < = 1 0 5 -10^5 <= k, nums[i] <= 10^5 105<=k,nums[i]<=105

2 solution

求前缀和,查找前缀和为总和一半的个数,由于改变某个元素时,部分前缀和已经改变,所以需要维持两个前缀和 map,一个是改变的元素之前的map,另一个是之后的 map,然后依次更新两个 map 并统计最大频数

代码

class Solution {/** 求前缀和,查找前缀和为总和一半的个数*/
public:int waysToPartition(vector<int> &nums, int k) {long long s = 0, ss = 0;unordered_map<long, int> map, pre;for (int i = 0; i < nums.size() - 1; i++) {s += nums[i];map[s]++;}s += nums.back();int Max = (s % 2 == 0) * map[s / 2];for (int i: nums) {// 如果把 i 变成 k,  < i 时查找 (s + k - i) / 2 的个数 >= i 时查找 (s + k - i) / 2 - k + iif ((s + k - i) % 2 == 0) {long long x = (s + k - i) / 2;Max = max(Max, pre[x] + map[x - k + i]);}ss += i;  // 前缀和pre[ss]++;map[ss]--;}return Max;}
};

结果

在这里插入图片描述

http://www.xdnf.cn/news/8934.html

相关文章:

  • ESP32-S3 学习笔记(2)-屏幕驱动和lvgl移植
  • 【MySQL系列】数据库死锁问题
  • TDK PC95铁氧体隔磁片的技术要求
  • uniapp中懒加载图片组件的封装与应用
  • 【Qt】QCustomPlot相关
  • 网络段、主机段、子网掩码
  • Python 学习日记 day26
  • 蓝桥杯178 全球变暖
  • 【深度解读】三一重工的数字化转型(下篇2)
  • 大数据学习(118)-SQL面试问题总结
  • @Valid和@Vlidated的区别
  • Windows安装Docker Desktop开启 Kubenetes制作并部署本地镜像
  • Java 装饰器模式(Decorator)详解​
  • AI练习:指纹
  • [C语言实战]C语言文件操作实战:打造高效日志系统(六)
  • RMAN恢复报错RMAN-06555及其解决方案
  • STM32F103_Bootloader程序开发02 - Bootloader程序架构与STM32F103ZET6的Flash内存规划
  • idea和cursor快速切换
  • 【Linux】定时任务 Crontab 与时间同步服务器
  • 基于多头注意力时间卷积网络(MATCN)的虚拟电厂短期功率预测模型
  • 『uniapp』自己实现手动图片列表滑动 + 图片手势缩放+ 图片点击缩放(详细图文注释)
  • 分布式消息中间件设计与实现
  • Android自定义View学习总结
  • 【机器人】复现 Embodied-Reasoner 具身推理 | 具身任务 深度推理模型 多模态场景 长远决策 多轮互动
  • Python Day33
  • GO 语言中变量的声明
  • Python中字典(dict)知识详解应用
  • 非接触式互连:当串扰是您的朋友时
  • NumPy 数组属性
  • 英语科研词汇现象及语言演变探讨