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

Leetcode 3729. Count Distinct Subarrays Divisible by K in Sorted Array

  • Leetcode 3729. Count Distinct Subarrays Divisible by K in Sorted Array
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3729. Count Distinct Subarrays Divisible by K in Sorted Array

1. 解题思路

对这一题而言,如果不用考虑去重,那么显然我们只需要求出给定数组的前序和数组,然后将其元素按照其对kkk的余数进行统计,那么对于其答案就是:
answer=∑i=0kci∗(ci−1)2answer = \sum\limits_{i=0}^{k} \frac{c_i * (c_i-1)}{2}answer=i=0k2ci(ci1)

其中,cic_ici表示余数为iii时的前序和的个数。

但是这里会有重复的情况,因此,我们需要去除掉这里多算的所有重复情况的个数。由于题目中已知数组是非递减的,因此,如果满足有两个子数组(ni⋯nj)(n_i \cdots n_j)(ninj)(nl⋯nr)(n_l \cdots n_r)(nlnr)完全相同,那么必有这些数的元素必然完全相同。

因此,我们只需要找出所有连续的相同元素的子串,考虑其中会产生多少个重复计算的数组个数即可。而要使得若干个相同元素的和被kkk整除,那么其连续的个数必然为kkkkkk和该元素的最大公约数的除数的倍数。而其被多记的次数就是该数组的长度减去对应的倍数的个数。

2. 代码实现

我们将其翻译为python代码语言就是:

class Solution:def numGoodSubarrays(self, nums: List[int], k: int) -> int:n = len(nums)cumsum = list(accumulate(nums, initial=0))reminders = [x%k for x in cumsum]cnt = Counter(reminders)ans = sum(x * (x-1) // 2 for x in cnt.values())idx = 0while idx < n:rb = bisect.bisect_right(nums, nums[idx])m = rb - idxif k == 1:ans -= m * (m+1) // 2 - melse:l = k // gcd(k, nums[idx])for i in range(l, m, l):ans -= m-iidx = rbreturn ans

提交代码评测得到:耗时311ms,占用内存41.28MB。

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

相关文章:

  • 电子商务推广怎么做内蒙网站建设seo优化
  • 涉县移动网站建设价格带商城的wordpress
  • Supabase CLI(命令行工具)的安装和配置
  • psd素材免费下载网站商城建设网站开发
  • 有什么做旅游攻略的网站制作ppt教程视频自学
  • 网站建设实训总结及体会上海出国留学中介
  • 一家专门做打折的网站美轮美奂的网站建设
  • 微网站哪家好网站服务器配置
  • 双语网站后台怎么做宜春个人网站建设
  • GPIO总结
  • 网站建设的需求怎么写邢台立享网络
  • 简单网站建设公司正能量网站网址大全
  • 买网站空间wordpress 搜索mysql
  • 仓颉随机数生成实用指南:从基础到扩展应用
  • 网站的架设手机模拟器
  • wordpress内容模板下载seo怎么做整站排名
  • 请问聊城做网站乔拓云智能建站官网登录入口
  • 怎么样自己做百度网站网站设计平台 动易
  • 响应式网站 图片尺寸奇数北京海淀区
  • led 网站模板易无忧建站
  • [SPSS] SPSS软件基础知识
  • 深圳市城乡住房和建设局网站seo 网站关键词
  • 住房建设部官方网站专家注册公司的网站做备案我是网站负责人如果离职以后要不要负法律责任
  • 企业网站源码怎么获取wordpress 转 html
  • 网站开发的软件环境有哪些wordpress文章页面模板下载
  • 团购网站案例青岛网站设计建设
  • 海口网站建设维护电厂cms系统是什么
  • 手机做网站过程动画制作专业学校排名
  • linux 特殊符号
  • 郑州建设网店网站辽宁建设工程信息网官网首页