首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

求和可被3整除的最长子数组,复杂度为O(N)

求和可被3整除的最长子数组,复杂度为O(N)。

解题思路:

首先,我们需要了解子数组的概念。子数组是指原始数组中连续的一段元素组成的数组。

针对这个问题,我们可以使用前缀和的思想来解决。前缀和是指从数组的第一个元素开始,依次累加到当前位置的元素之和。

具体步骤如下:

  1. 创建一个长度为N的数组prefixSum,用于存储原始数组的前缀和。
  2. 初始化一个长度为3的数组remainder,用于存储前缀和对3取余的结果。
  3. 初始化两个变量maxLength和startIndex,分别用于记录最长子数组的长度和起始位置。
  4. 遍历原始数组,计算前缀和,并将前缀和对3取余的结果存储在remainder数组中。
  5. 如果remainderi等于0,则表示从数组的起始位置到当前位置的子数组的和可以被3整除,更新maxLength和startIndex。
  6. 如果remainderi在remainder数组中已经出现过,则表示存在一个子数组的和可以被3整除,更新maxLength和startIndex。
  7. 返回原始数组中从startIndex开始,长度为maxLength的子数组。

代码实现如下(使用Python语言):

代码语言:python
代码运行次数:0
复制
def findLongestSubarray(nums):
    N = len(nums)
    prefixSum = [0] * (N + 1)
    remainder = [-1] * 3
    maxLength = 0
    startIndex = 0

    prefixSum[0] = 0
    remainder[0] = 0

    for i in range(1, N + 1):
        prefixSum[i] = prefixSum[i - 1] + nums[i - 1]
        currRemainder = prefixSum[i] % 3

        if remainder[currRemainder] == -1:
            remainder[currRemainder] = i
        else:
            length = i - remainder[currRemainder]
            if length > maxLength:
                maxLength = length
                startIndex = remainder[currRemainder]

    return nums[startIndex: startIndex + maxLength]

# 测试用例
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = findLongestSubarray(nums)
print(result)

以上代码的时间复杂度为O(N),其中N为原始数组的长度。该算法通过遍历一次原始数组,计算前缀和并更新最长子数组的长度和起始位置,最后返回最长子数组。

推荐的腾讯云相关产品:云服务器CVM、云数据库MySQL、云函数SCF、云存储COS。

  • 云服务器CVM:提供弹性计算能力,可满足各类应用的需求。产品介绍链接
  • 云数据库MySQL:提供高性能、可扩展的关系型数据库服务。产品介绍链接
  • 云函数SCF:无服务器的事件驱动型计算服务,可实现函数的自动弹性扩缩容。产品介绍链接
  • 云存储COS:提供安全、稳定、低成本的对象存储服务,适用于各类数据存储场景。产品介绍链接

以上是针对求和可被3整除的最长子数组的完善且全面的答案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【刷题】前缀和进阶

算法思路 首先最好想就是暴力枚举算法O(n^2): 从 0 开始依次枚举子数组和 满足条件计数+1 这样毋庸置疑是会超时。并且会有大量重复操作,求了许多重复和。...,这个时间复杂度O(n^2) + O( n ),也会超时。...3 Leetcode 974. 和可被 K 整除数组 上链接:974. 和可被 K 整除数组 题目描述 这个题目要求我们寻找 和 可以被 k 整除数组,很好理解。...来看样例: 输入:nums = [4,5,0,-2,-3,1], k = 5 输出:7 解释:有 7 个子数组满足其元素之和可被 k = 5 整除: [4, 5, 0, -2, -3, 1], [5]...我们可以将问题转换一下,把数组0都变成-1,然后 具有相同数量0和1最长数组和就是 0 。这样就转换为和k长子数组。 整体框架与Leetcode 560.

8310

LeetCode 03:面试关:如何找出字符串中无重复最长子串?

示例: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符长子串是 "abc",所以其长度 3。...题目说明 题目很简单,就是从一个字符串中找出不包含重复字符长子长度。 该题如果用暴利破解方法进行循环判断,则时间复杂度直接变为O(n^2),是比较恐怖。...简单示例 先通过一个简单示例来看一下滑动窗口运作,比如有一个数组[1,3,5,6,2,2],设定滑动窗口(window)大小3,那么当窗口从数组开始位置滑动到最终位置时依次计算每个窗口内3个元素和...对于类似“请找到满足 xx x 区间(子串、子数组 xx ”这类问题都可以使用该方法进行解决。...而窗口内字符通过Set来存储,判重通过Setcontains方法,获取最大值通过Mathmax方法来操作。 最后,此算法时间复杂度O(n),其中n是字符串长度。

37120

LeetCode 周赛上分之旅 #33 摩尔投票派上用场

优化) 事实上,当下标 i 可以被 n 整除时,那么有下标 n / i 也可以被 n 整除,因此我们只需要检查 [0, \sqrt(n)] 范围。...: 时间复杂度O(nlgn) 瓶颈在排序,同向双指针模拟时间 O(n) ; 空间复杂度O(lgn) 瓶颈在排序。...: 时间复杂度O(n) 求支配元素和枚举分割点时间复杂度都是 O(n) ; 空间复杂度O(n) 散列表空间。...: 时间复杂度O(L + n^2·M^2) 构造 forbiddenSet 散列表时间复杂度 O(L) ,其中 L forbidden 中所有字符总长度。...枚举子串个数 n^2 ,而检查子串是否合法时间复杂度O(M^2) ,其中 n 是 word 字符串长度,而 M 是子串最大长度,M = 10,因此枚举阶段时间复杂度O(n^2·

26740

【LeetCode 137.只出现一次数字II】三种解法:哈希表、数学技巧和位运算(JavaScript实现)

提示:可以和《【LeetCode 136.只出现一次数字 I】巧用异或运算》 类比。 解法 1: 直观哈希表 解决思路很简单,直接遍历一边数组,然后统计每个数字出现次数,存入哈希表中。...那么求 d 表达式是:2 * d = 3*(a + b + c + d) - (3a + 3b + 3c + d) 为了计算(a + b + c + d),可以将数组去重后,再求和。...* sum1 - sum2) / 2); }; 这种方法还是额外使用了O(N)空间。...整体算法流程如下: 从第 1 位开始 创建掩码(当前位 1,其他 0),count 设置 0 将每个数字和掩码进行&运算,如果结果不为 0,count 加 1 如果 count 整除 3,说明出现一次数字这一位不是...{ res = res | mask; } } return res; }; 时间复杂度O(N),空间复杂度O(1)。

71020

BAT面试算法进阶(1)--两数之和

carry必定是0或者1.2个数累加,需要考虑进位问题.则采用一个变量来保存进位值. 2.3 伪代码 将当前节点初始化为返回列表哑节点; 将进位carry设置0; 将p,q分别指向列表L1,L2头部...将x设为节点p值.如果P已经到达L1末尾,则将其值设置0; 将y设置节点q值,如果q已经到达L2末尾,则将其值设置0; 求和 sum = x+y+carry; 更新进位 carry =...返回哑节点下一个节点. 2.4 复杂度分析 时间复杂度: O(max(m,n)),假设m,n分别表示L1,l2长度.上面的算法最多重复max(m,n)次 空间复杂度:O(max(m,n)), 新列表长度最多...max(m,n)+1 2.5 参考代码 算法面试系列文章: BAT面试算法进阶(2)- 无重复字符长子串(暴力法) BAT面试算法进阶(3)- 无重复字符长子串(滑动窗口法) BAT面试算法进阶...(方法二) BAT面试算法进阶(7)- 反转整数 BAT面试算法进阶(8)- 删除排序数组重复项 BAT面试算法进阶(9)- 三维形体投影面积 BAT面试算法进阶(10)- 最长斐波那契子序列长度

29120

字节跳动一道动态规划面试题

示例 2: 输入: "cddpd" 输出: 3 一个可能最长回文子序列为 "ddd"。 基本思路 直接暴力方式还是递归出它所有的子序列就好了嘛!虽然这一听就不是太好主意。?...时间复杂度达到了O(2^n),是输入序列长度,这里空间复杂度O(n)。 没关系,我们再来用我们擅长缓存来优化。 自上而下 我们来用一个数组去保存已经解决过子问题。...我们现在用一个二维数组缓存了子问题结果,dp[st.length()][st.length()],也就是说,我们不会有超过n*n子问题,n是输入序列长度,这意味着我们时间复杂度O(n^2)。...而我们空间复杂度也因为数组开销变成了O(n^2),没关系,空间换时间嘛,很正常。 自下而上 我们是想尝试给定序列所有子序列,我们还是用二维数组来存储我们结果。...O(n^2)。

98610

前端从零开始刷leetCode-持续更新

两数之和 给定一个整数数组 nums 和一个整数目标值 target请,你在该数组中找出和目标值 target那两个整数并返回它们数组下标。 你可以假设每种输入只会对应一个答案。...解题思路一:两层循环求和跟目标值比较,显然不够高效,复杂度 image.png 代码如下 /** * @param {number[]} nums * @param {number} target...无重复字符长子串 给定一个字符串,请你找出其中不含有重复字符长子长度。...示例 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符长子串是 "abc",所以其长度 3。...解题思路一:两层循环求,第一层循环字符串与第二次字符串拼接,第二层判断字符串是否已经包含在之前拼接数据中,比较每个不重复字符串长度,复杂度 O(n2)O(n^2)O(n2) 代码如下 /** *

94120

精读《算法 - 滑动窗口》

这要仅需遍历一次,时间复杂度 O(n)。 之所以说这道题,是因为这道题是单指针,即只有一个指针在数组中移动,并配合哈希表快速求解。...为了降低时间复杂度,我们希望只遍历一次数组,这就需要数组满足一定条件我们才能用滑动窗口,所以我们对数组进行排序,使用快排时间复杂度 O(nlogn),时间复杂度已超出两数之和,不过因为题目复杂,这个牺牲是无法避免...首先还是排序,然后双重递归,即确定前两个数不变,不断包夹后两个数,后两个数就是 i+1 和 n-1,算法和三数之和一样,所以最终时间复杂度 O(n³)。...所以对于 N 数之和,通过排序付出了 O(nlogn) 时间复杂度之后,可以用滑动窗口,将 2 个数时间复杂度优化为 O(n),所以整体时间复杂度就是 O(N - 2 + 1 个 n),即 O(N-1...个 n),而最小时间复杂度 O(n²) 比 O(nlogn) 大,所以总是忽略快排时间复杂度,所以三数之和时间复杂度O(n²),四数之和时间复杂度 O(n³),依此类推。

60320

【综合笔试题】难度 45,字符处理线段树经典运用

题目描述 这是 LeetCode 上「2213. 由单个字符重复长子字符串」,难度「困难」。 Tag : 「区间求和」、「线段树」 给你一个下标从 0 开始字符串 s 。...返回一个长度 k 数组 lengths,其中 lengths[i] 是在执行第 i 个查询之后 s 中仅由单个字符重复组成长子字符串长度 。...由单个字符重复组成长子字符串是 "bbb" ,长度 3 。 - 第 2 次查询更新后 s = "bbbccc" 。由单个字符重复组成长子字符串是 "bbb" 或 "ccc",长度 3 。...由单个字符重复组成长子字符串是 "zz" ,长度 2 。 - 第 2 次查询更新后 s = "aaazz" 。由单个字符重复组成长子字符串是 "aaa" ,长度 3 。...; } return ans; } } 时间复杂度O(m\log{n}) 空间复杂度O(n) 最后 这是我们「刷穿 LeetCode」系列文章第 No

51530

LeetCode 周赛上分之旅 #44 同余前缀和问题与经典倍增 LCA 算法

= 1 } return ret } } 复杂度分析: 时间复杂度O((high-low)lg^{high}) 单次检查时间 O(lg^{high})...: 时间复杂度O(n^2·m) 最多有 n^2 种子状态,其中 m 是字符串平均长度, O(m) 是构造中间字符串时间; 空间复杂度O(n) 回溯递归栈空间。...: 问题目标: 统计数组中满足目标条件数组; 目标条件: 在子数组范围 [l, r] 内,设 cnt 满足 nums[i] % m == k 索引 i 数量,并且 cnt %...: 时间复杂度O(n) 线性遍历,单次查询时间 O(1) ; 空间复杂度O(m) 散列表空间。...和 K 数组 974. 和可被 K 整除数组 523. 连续数组和 525. 连续数组 ---- T4.

28330

最长回文子串——马拉车算法详解

但是,第4个方法复杂度 O(n2) O ( n 2 ) O(n^2),而马拉车算法对其进行了改进,将复杂度变为了线性。...如何计算数组 p 一般方法,是以中心点中心,挨个将半径逐步扩张,直至字符串不再是回文字符串。但是这样做,整体算法复杂度 O(n2) O ( n 2 ) O(n^2)。...因为以 id 中心回文子串3,包含了红1和红2,而且红1和红2以 id 中心,那么一定有红2=红1。并且已经知道,红1是以 j 中心长子串,那么红2也肯定是以 i 中心长子串。...3数组 p 中最大值,即为最长回文子串半径 根据半径数组 p 定义,如果最大值对应位置 i,则最大回文子串 ss[i - p[i] : i + p[i] + 1]。...Manacher发明出来。 时间复杂度O(n)。

75420

leetcode 1208. 尽可能使字符串相等-----滑动窗口篇五,前缀和篇一,二分篇一

空间复杂度O(N) ,因为使用了 costs 数组用于保存每个字符转换开销。...前缀和数组: 那么接下来我们只需要找出成本不超过 maxCost 最大长度区间,这个长度区间其实就是滑动窗口长度,滑动窗口长度范围 [1, n] (n 字符串长度)。...我们可以通过数据范围大概分析一下哈,共有 n 个滑动窗口长度要枚举,复杂度 O(n),对于每个滑动窗口长度,需要对整个前缀和数组进行滑动检查,复杂度 O(n)。...:预处理出前缀和复杂度O(n);二分出「滑动窗口长度」复杂度O(logn),对于每个窗口长度,需要扫描一遍数组进行检查,复杂度O(n),因此二分复杂度O(nlogn)。...整体复杂度 O(nlogn) 空间复杂度:使用了前缀和数组复杂度 O(n)

62420

动态规划思路解析

我们从三个力扣例题中体会下动态规划: 青蛙跳台阶 连续子数组最大和 无重复字符长子串 青蛙跳台问题 首先来定义状态:dp[n]表示前n级台阶跳法;然后来确定状态转移方程,假设已知n-1种跳法...,当青蛙站在第n-1级台阶时只有一种跳法(即站在倒数第一级台阶),此时跳法dp[n-1]*1;当青蛙在n-2级台阶时,由于之前已计算过在n-1级跳法,所以不能跳到n-1级上,因此只有跳两级这一种跳法...dp[状态1][状态2][...] = 求值(选择1, 选择2, ...) ---- 连续子数组最大和 题目满足动态规划两点标准,穷举和求值,动态规划也正是本题最优解法。...不需要引入dp列表,空间复杂度降为O(1)。...返回值:最长不重复子字符串长度max(dp) 空间复杂度优化: 由于返回值取dp列表最大值,借助tmp存储dp[j],变量res每轮刷新最大值即可。节省dp列表O(N)额外空间开销。

36820

BAT面试算法进阶(3)- 无重复字符长子串(滑动窗口法)

算法题解读 题目大意:给定一个字符串,找出不含有重复字符长子长度 解读Example 给定"abcabcbb",没有重复字符长子串是"abc",那么长度就是3 给定"bbbbb",最长子串就是..."b",长度就是1 给定pwwkew,最长子串就是"wke",长度3, ==注意,==必须是一个子串."...滑动窗口 是指的是数组/字符串问题常用抽象概念.窗口通常在数组/字符串中由开始和结束索引定义一系列元素集合.即可[i,j)(左闭,右开).而滑动窗口是可以将2个边界向某一个方向"滑动"窗口.例如...实现 Java Code 复杂度分析 时间复杂度: o(2n) = o(n);在最糟糕情况下,每个字符顶多被i,j访问2次....空间复杂度: o(min(m,n)).窗口滑动法需要O(K)空间,K指的是集合大小.而集合大小取决于字符串n大小以及字符串集大小.

31120
领券