首页 > 其他分享 >LeetCode523——连续的子数组和

LeetCode523——连续的子数组和

时间:2023-09-12 09:33:46浏览次数:38  
标签:23 int nums 示例 整数 连续 数组 LeetCode523

给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:

  • 子数组大小 至少为 2 ,且
  • 子数组元素总和为 k 的倍数。

如果存在,返回 true ;否则,返回 false 。

如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。

 

示例 1:

输入:nums = [23,2,4,6,7], k = 6
输出:true
解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。

示例 2:

输入:nums = [23,2,6,4,7], k = 6
输出:true
解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。 
42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。

示例 3:

输入:nums = [23,2,6,4,7], k = 13
输出:false

 

提示:

  • 1 <= nums.length <= 10e5
  • 0 <= nums[i] <= 10e9
  • 0 <= sum(nums[i]) <= 2e31 - 1
  • 1 <= k <= 2e31 - 1

我的第一思路,前缀和加循环判断,但是也要循环两次,时间复杂度为O(n²),数据量为10e5,会超时

[K倍区间]问题:这类问题可以归类于K倍区间问题,判断数组中是否存在一个长度至少为二而且里面数据之和恰好为某个数的整数倍。

可以利用HashSet存储每一次遍历区间的和对这个数取余,若某个区间的取余操作在set中已经存在,则必然存在和为这个数的整数倍的区间。

class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        int n = nums.length;
        int sum = 0;
        Set<Integer> set = new HashSet<>();
        for(int i=0;i<n;i++)
        {
            sum += nums[i];
            if(set.contains(sum % k))
            {
                return true;
            }
            set.add((sum - nums[i]) % k);
        }
        return false;
    }
}

 

标签:23,int,nums,示例,整数,连续,数组,LeetCode523
From: https://www.cnblogs.com/Yuansj0206/p/17695141.html

相关文章

  • 求数组中第三大的数
    //1.从数组中找出第三大的数,例如{10,10,9,9,8,8,7,7}第三大的数是8publicclassThirdLargestNumber{publicstaticvoidmain(String[]args){int[]nums={10,10,9,9,8,8,7,7};intthirdLargest=findThirdLargest(nums);System.......
  • 剑指 Offer 66. 构建乘积数组
    题目链接:剑指Offer66.构建乘积数组题目描述:**给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B[i]的值是数组A中除了下标i以外的元素的积,**即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。解法思路:代码:funcconstructArr(a[......
  • 实现数组去重的七种方法
    1.方法一:利用两层循环+数组的splice方法通过两层循环对数组元素进行逐一比较,然后通过splice方法来删除重复的元素。此方法对NaN是无法进行去重的,因为进行比较时NaN!==NaN。letarr=[1,2,2,'abc','abc',true,true,false,false,undefined,undefined,NaN,NaN]functi......
  • LeetCode 53. 最大子数组和
    最大子数组和(medium)题目链接:53.最大子数组和题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的......
  • LeetCode 918. 环形子数组的最大和
    环形子数组的最大和(medium)题目链接:918.环形子数组的最大和题目描述:给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一......
  • swift5 区间类型和数组转化
    在Swift5中,你可以使用区间(Range)类型来表示一系列连续的数字,并且可以使用一些内置的函数和方法将区间类型和数组(Array)之间进行转换。首先,我们来了解一下如何创建和使用区间类型。创建区间类型:swiftletrange=1...5//创建一个闭区间,包括1到5letopenRange=1..<5//创建......
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II
    题目链接:剑指Offer56-II.数组中数字出现的次数II题目描述:在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解法思路:代码:......
  • 剑指 Offer 57 - II. 和为s的连续正数序列
    题目链接:剑指Offer57-II.和为s的连续正数序列题目描述:输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。解法思路:双指针:当总和小于target时,j指针向后移动,直到大于或等于停......
  • 【学习笔记】树状数组
    PS:未经许可,禁止转载。思路来源于我的老师$\text{hoogy}$,非常感谢,%%%。-五分钟丝滑动画讲解|树状数组-〔manim|算法|数据结构〕完全理解并深入应用树状数组单点修改,区间查询前置芝士:一维前缀和设原数组$a$,前缀和数组$b$,则有:$b[i]=\sum\limits_{j=1}^ia[j]$。推......
  • 数组
        ......