首页 > 其他分享 >Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的子数组】【前缀和思想】

Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的子数组】【前缀和思想】

时间:2024-03-28 10:44:46浏览次数:21  
标签:974 题目 nums int sum mp 数组 930

这道题目是经典的求 子数组之和=goal的个数,用map维护。

但是笔者在实现的过程中发现0的情况不是很好出来,问题在于mp[sum]和sum+=num的代码语句存在位置问题。后来看了下代码还是自己没有考虑清楚。

这种类型的题目就是要想清楚你的做法,以及边界条件。

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        map<int,int> mp;
        int n=nums.size();
        // mp[0]=1;
        int sum=0,ans=0;
        for(int i=0;i<n;i++){
            int num=nums[i];
            mp[sum]++;
            sum+=num;
            if(mp[sum-goal]){
                ans+=mp[sum-goal];
            }
        }
        return ans;
    }
};

下面这道题目可以看成上面这道题目的衍生。

这道题目转化成求子数组和为k的个数。一下就能A出来

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        for(int i=0;i<nums.size();i++){
            nums[i]=nums[i]%2;
        }
        int sum=0,ans=0;
        map<int,int> mp;
        for(int i=0;i<nums.size();i++){
            mp[sum]++;
            sum+=nums[i];
            ans+=mp[sum-k];
        }
        return ans;

    }
};

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        map<int,int> mp;
        int sum=0,ans=0;
        int n=nums.size();
        for(int i=0;i<n;i++){
            mp[sum]++;
            sum+=nums[i];
            sum=sum%k;
            ans+=mp[k+sum];
            ans+=mp[sum];
            ans+=mp[sum-k];
        }
        return ans;
    }
};

标签:974,题目,nums,int,sum,mp,数组,930
From: https://www.cnblogs.com/pengge666/p/18101024

相关文章

  • JavaScript变量/数组
    变量1、var:全局变量(作用域范围大,且允许重复声明)2、let:局部变量(作用域仅在代码块内,且不允许重复声明)3、const:常量(一旦声明,常量的值不能改变)数组特点:长度可变,类型可变for和foreach的区别:1、for遍历数组中的所有元素2、foreach遍历数组中有值的元素,并调用一次传入的函......
  • 力扣由浅至深 每日一题.16 ​ 合并两个有序数组​
    日复一日的生活里也会有新的快乐                 ——24.3.27合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2......
  • 【剑指offer】73. 数组中只出现一次的两个数字(超详解)
    题目链接acwingleetcode题目描述给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。输入:nums=[1,2,......
  • 2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n
    2024-03-27:用go语言,多维费用背包。给你一个二进制字符串数组strs和两个整数m和n,请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。输入:strs=["10","0001","111001","1","0"],m=......
  • 栈结构-数组形式
    栈是一种"后进先出(LIFO)"的线性结构,特点是只有一个出口.对于新增或者待删除的元素都保存在栈的同一端,成为"栈顶".另一端则就是"栈底"了.新加的元素靠近栈顶,旧元素靠近栈顶.就好比一口深井管道,上面的出口是栈顶,底部是栈底.先掉下来兄弟,沉得愈深,后掉......
  • 对数组方法reduce和map的深入理解,用reduce方法实现map方法
     引言:偶然看到一道面试题,希望可以用reduce方法实现map方法,看过之后发现这是个有趣的逻辑思维题、既要对数组方法有深入理解也要有一定编程能力。一、reduce语法reduce:高阶数组方法,对数组中的所有元素应用一个函数(由你提供),将其减少为单个输出值。arr.reduce((prev,cur,ind......
  • 数组自定义unshift和去重
    arr=[1,2,4,5]arrObj=Object.assign([],arr)//自定义实现数组unshiftArray.prototype.myunshift=function(...eles){constlen=this.lengthfor(leti=1;i<=len;i++){arr[i]=arrObj[i-1]}varargs=Array.from(eles);arr[0]=......
  • 03-JavaScript数组
    1.通过直接量创建数组vararr=[1,2,3,'abc','true'];console.log(arr);2.通过构造函数来创建数组vararr2=newArray("张三","李四");console.log(arr2);vararr3=newArray(5);//数组长度console.lo......
  • JavaScript数组常用方法
    数组的常用方法有push(),unshift(),pop(),shift(),reverse(),sort(),splice(),concat(),join(),slice(),.....在工作中常用到的有增删改查,前增unshift,后增push(),前删shift(),后删pop(),修改指定元素splice(),查找indexOf(),lastindexof(),和ES6新增的数组方法forEach()、map()、filter()、r......
  • 每日一题 --- 数组中的第 K 个最大元素[力扣][Go]
    数组中的第K个最大元素题目:数组中的第K个最大元素给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。示例1:输入:[3,2,1,5,6,4]和k=2输出:5示例2:输入:[3,2,3,1,2......