文章目录

  • 1. 题目
  • 2. 解题


221 / 3117,前7.1%

574 / 9692,前 5.9%

周赛前2题如下:
LeetCode 5641. 卡车上的最大单元数(排序,模拟)
LeetCode 5642. 大餐计数(map计数 + 二分查找)
第4题:LeetCode 5644. 得到子序列的最少操作次数(最长上升子序DP nlogn)

1. 题目

我们称一个分割整数数组的方案是 好的 ,当它满足:

  • 数组被分成三个 非空 连续子数组,从左至右分别命名为 left , mid , right 。
  • left 中元素和小于等于 mid 中元素和,mid 中元素和小于等于 right 中元素和。

给你一个 非负 整数数组 nums ,请你返回 好的 分割 nums 方案数目
由于答案可能会很大,请你将结果对 109 + 7 取余后返回。

示例 1:
输入:nums = [1,1,1]
输出:1
解释:唯一一种好的分割方案是将 nums 分成 [1] [1] [1] 。示例 2:
输入:nums = [1,2,2,2,5,0]
输出:3
解释:nums 总共有 3 种好的分割方案:
[1] [2] [2,2,5,0]
[1] [2,2] [2,5,0]
[1,2] [2,2] [5,0]示例 3:
输入:nums = [3,2,1]
输出:0
解释:没有好的分割方案。提示:
3 <= nums.length <= 10^5
0 <= nums[i] <= 10^4

https://leetcode-cn.com/problems/ways-to-split-array-into-three-subarrays/

2. 解题

  • 二分查找前缀和的切分位置
class Solution {public:int waysToSplit(vector<int>& nums) {int n = nums.size();vector<int> presum(nums);for(int i = 1; i < n; i++)presum[i] += presum[i-1];//前缀和long long ans = 0, mod = 1e9+7;for(int i = 0; i < n-2; i++){int a = presum[i];auto it = lower_bound(presum, i+1, n-2, 2*a);//第二段的前缀和至少为 2a, 在 位置 [i+1, n-2] 内查找 if(it == -1)break;// b = presum[it]-a,  c = presum[n-1]-presum[it]// c >= b,  presum[it] <= (presum[n-1]+a)/2auto it1 = upper_bound(presum, i+1, n-2, (presum[n-1]+a)/2);if(it1 != -1 && it1>=it)ans = (ans+it1-it+1)%mod;}return ans;}int lower_bound(vector<int>& presum, int L, int R, int t){int l = L, r = R, n = presum.size(), mid;while(l <= r){int mid = (l+r)/2;if(presum[mid] < t)l = mid + 1;else{if(mid==L || (presum[mid-1] < t))return mid;elser = mid - 1;}}return -1;}int upper_bound(vector<int>& presum,  int L, int R, int t){int l = L, r = R, n = presum.size(), mid;while(l <= r){int mid = (l+r)/2;if(presum[mid] > t)r = mid - 1;else{if(mid==R || (presum[mid+1] > t))return mid;elsel = mid + 1;}}return -1;}
};

368 ms 83.4 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)相关推荐

  1. Leetcode1712. 将数组分成三个子数组的方案数[C++题解]:双指针和前缀和

    文章目录 本题分析 题目链接 本题分析 题目重述: 给定一个非负的数组,要求将其分成3个非空的三段,要求每一段的数字之和依次递增(可以相等),求总共有几种分法. 题目解答: 双指针算法 思路:枚举第二 ...

  2. LeetCode 2302. 统计得分小于 K 的子数组数目(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度. 比方说,[1, 2, 3, 4, 5] 的分数为 (1 + 2 + 3 + 4 + 5) * 5 = ...

  3. LeetCode 2035. 将数组分成两个数组并最小化数组和的差

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.算法详解 3.时间复杂度 4.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你一个 ...

  4. 【动态规划】将一个包含m个整数的数组分成n个数组,每个数组的和尽量接近,及其变形(Python实现)

    背景 实际的问题来源于LQA系统的人员分配工作量,有两种方式,一种是 平均分配,一种是按给定比例分配.不需要AC,能得到符合题意的解就算达成目标. 平均分配 一个order订单包含一个xls表格,内含 ...

  5. 网易实习生算法组编程题二:求数组的两个子数组和的最大值

    求一个正整数数组的两个子数组,使其和相等,找出满足这样要求的子数组和的最大值,若不存在,则返回-1.比如[1,1,2,3,5,20],结果为6. #include<iostream> #i ...

  6. LeetCode 528. 按权重随机选择(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...

  7. LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点. 提示: 整数点是具有整数坐标的点. 矩形周边上 ...

  8. leetcode 给N x 3网络图涂色的方案数

    1.题目详情       leetcode 给N x 3网络图涂色的方案数 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就 ...

  9. leetcode 5607. 生成平衡数组的方案数 前缀和

    生成平衡数组的方案数 给你一个整数数组 nums .你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素.请注意剩下元素的下标可能会因为删除操作而发生改变. 比方说,如果 nums = [6 ...

最新文章

  1. 最新:2021年度U.S.News美国大学排名发布,哈佛不是第一!
  2. 谷歌自动驾驶专利大曝光!
  3. Android NDK JNI开发3
  4. 快速排序最好,最坏,平均复杂度分析
  5. 让VC编译的Release版本程序在其他机器上顺利运行
  6. 结合file和iconv命令转换文件的字符编码类型
  7. Silverlight4.0教程之WebBrowser控件(Silverlight内置HTML浏览器控件)
  8. 【CodeForces - 501C】Misha and Forest (思维构造,树,数学异或)
  9. php fpm在哪配置,php7的php-fpm.conf文件在哪里
  10. Intellij Idea: Thymeleaf 命名空间th报错
  11. iPhone手机更换自定义铃声
  12. Thinkpad连续响4遍4个短嘀故障记录
  13. 下载《阿里巴巴Java开发手册(详尽版)1.4.0》 与 码出高效,码出质量
  14. BCM业务连续性管理
  15. html表格可视化设计器,基于vue-element-ui的一款表格设计器table-making
  16. Jetson TK1 刷机步骤小记
  17. 第3周项目1-顺序表的基本运算
  18. RTP 发送PS流工具(已经开源)
  19. 微信小程序-书籍阅读 【阅读、小说阅读、图书、世界读书日、爱读书爱分享】
  20. python opencv 入门 绘图函数 (3)

热门文章

  1. Flask项目中应用七牛云存储
  2. 如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制
  3. linux kill命令信号,Linux kill 命令详解
  4. spring boot 实战
  5. 动态dp模板题(树剖+dp+线段树)
  6. 跨年操作--new Date()
  7. 关于NIOS ii烧写的几种方式(转)
  8. 开源代码分析技巧之——打印调用逻辑
  9. POJ-3590 The shuffle Problem 置换+DP | DFS
  10. git命令:将多个commit提交记录修改为1条