js解leetcode(75)-中等

1.和可被K整除的子数组

题目:给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。

思路:这题和之前某题很像hhh,套路

基本思路是,对于一个子数组而言。记录每一个下标的前缀和sum[i]。

如果有i > j,且sum[i] - sum [j]0是k的整数倍,那么有[i,j]这个子数组满足条件。

什么时候sum[i] - sum[j]是K的整数倍呢?二者对k的余数相等时。

所以,记录前缀和,并记录余数是0-k的前缀和的数组的数量dp。

对于 余数为0时,子数组数量为dp[0] + (dp[0] * (dp[0] - 1))/2

其他余数时,子数组数量为 (dp[i] * (dp[i] - 1))/2

时间复杂度O(n),空间复杂度O(k)

/**
 * @param {number[]} A
 * @param {number} K
 * @return {number}
 */
var subarraysDivByK = function(A, K) {
   const l = A.length;
  const nums = new Array(K).fill(0);
  let v = A[0];
  nums[((v % K) + K) % K]++;

  for (let i = 1; i < l; i++) {
    v += A[i];
    nums[((v % K) + K) % K]++;
  }
  let c = nums[0] + (nums[0] * (nums[0] - 1)) / 2;
  for (let i = 1; i < K; i++) {
    c += (nums[i] * (nums[i] - 1)) / 2;
  }
  return c;
};

2.最长湍流子数组

题目:

当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:

若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值