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

鲜花网站建设方案c9设计软件

鲜花网站建设方案,c9设计软件,建筑之家,亿起发插件wordpress目录 974. 和可被 K 整除的子数组 题目描述: ​编辑 题目解析: 代码实现: 525. 连续数组 题目描述: 题目解析: 代码实现: 1314. 矩阵区域和 题目描述: 题目解析: 代码实现…

目录

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

题目描述:

​编辑 题目解析:

代码实现:

525. 连续数组

题目描述:

题目解析:

代码实现:

1314. 矩阵区域和

题目描述:

题目解析:

 代码实现:



题目描述:

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。

子数组 是数组中 连续 的部分。

  • 1 <= nums.length <= 3 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • 2 <= k <= 104

 题目解析:

  • 这道题与之前那道和为k的子数组特别像,只是条件不一样而已,但是数据规模变大了,所以再使用枚举的方法就会超时。
  • 按照我们之前枚举的思路,枚举到一个区间,假如是sum(x,y],那么需要用sum[y]-sum[x],那么可以想到如果sum(x,y]可以被k整除,那么sum[y]与sum[x]除k的余数应该是相等的,那么我们就可以用一个哈希表将这个整除结果保存下来,算到sum[y]时,就可以直接取出对应值,并计算出区间长度。
  • 由于要求的是最长的子数组,那么对于相同的余数,我们只需要记录最小的那个位置即可。
  • 由于负数除k的余数会被计算为负数,所以在计算余数时要稍微处理一下,代码见。

代码实现:

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {int n = nums.size();map<int, int> record({{0, 1}});int ans = 0;int sum = 0;for (auto num : nums) {sum += num;int m = (sum % k + k) % k;if (record.count(m))ans += record[m];record[m]++;}return ans;}
};

525. 连续数组

题目描述:

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

  • 1 <= nums.length <= 10^5
  • nums[i] 不是 0 就是 1

 

题目解析:

  •  这里如果采用前缀和加枚举区间的方法的话,只需要让区间的和等于区间长度的一半就可以,但是数据规模决定了必然会超时。
  • 再想想,1的数目与0的数目相同,那么1的数目减去0的数目就是0,假设x[i]是以起始位置为起点,i为结尾的区间1的个数,y[i]是对应0的个数,那么对于(i,j]这个区间,如果符合条件的话,就有:
    • x[j] - x[i] - (y[j] - y[i]) = 0;
    • 即x[j] - y[j] = x[i] - y[i];
    • 那么我们就可以将x[j] - y[j]作为关键值,将对应位置保存起来,方便直接取出即可。
    • 同样只需要保存最小位置即可。

代码实现:

class Solution {
public:int findMaxLength(vector<int>& nums) {map<int, int> hash({{0, 0}});int n = nums.size();int sum1 = 0;int sum0 = 0;int ans = 0;for (int i = 0; i < n; i++) {if (nums[i] == 1)sum1++;elsesum0++;if (hash.count(sum1 - sum0)) {ans = max(ans, i + 1 - hash[sum1 - sum0]);}if (!hash.count(sum1 - sum0)) {hash[sum1 - sum0] = i + 1;}}return ans;}
};

1314. 矩阵区域和

题目描述:

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: 

  • i - k <= r <= i + k,
  • j - k <= c <= j + k 且
  • (r, c) 在矩阵内。

 

题目解析:

  •  题目上说的看起来有点复杂,其实就是对于ans[i][j],返回mat中从i-k到i+k,从j-k到j+k,也就是一个矩阵(如果不符合条件取边界)范围内的数的和。

  • 我们可以用一个二维前缀和数组先记录从起始位置到(i,j)这个位置的范围内的所有树的和。

    • 至于计算公式,其实是一个dp过程,对于sum[i][j](注:我们是从左到右,从上到下计算的,这个位置之前的所有值都假设已经计算完毕),我们这样计算:sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mat[i][j]即可(实际代码中我们对sum数组做出优化,但大体公式不变),大家可以结合图来理解:

  • 然后就是计算ans数组,结合表格解释:
    • 我们要计算红色矩阵中的各个数字的和。
    • sum[i][j]表示从起始位置开始,我们需要减去一些不必要的,也就是蓝色和绿色还有橙色。
    • 如果单纯减去sum[m][j]与sum[i][n],会导致橙色被减去两次,所以要加回来。
    • 公式:ans[i][j] = sum[i][j] - sum[m][j] - sum[i][n] + sum[m][n]

 

 代码实现:

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int n = mat.size();int m = mat[0].size();vector<vector<int>> sums(n + 1, vector<int>(m + 1, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {sums[i + 1][j + 1] =sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + mat[i][j];}}vector<vector<int>> ans(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {int r1 = max(0, i - k);int r2 = min(n, i + k + 1);int c1 = max(0, j - k);int c2 = min(m, j + k + 1);ans[i][j] =sums[r2][c2] - sums[r2][c1] - sums[r1][c2] + sums[r1][c1];}}return ans;}
};

文章转载自:

http://8hD4MLcH.bxyzr.cn
http://HLlU6YyA.bxyzr.cn
http://lk6zRKWa.bxyzr.cn
http://ISys3E9k.bxyzr.cn
http://kbwowSd6.bxyzr.cn
http://F5nA7HOg.bxyzr.cn
http://wZ485J4z.bxyzr.cn
http://d9PnDxDc.bxyzr.cn
http://TuhiZlp5.bxyzr.cn
http://urulxO38.bxyzr.cn
http://eGZnGD91.bxyzr.cn
http://HEpeev9F.bxyzr.cn
http://JmlIGe1q.bxyzr.cn
http://NCiCyJEt.bxyzr.cn
http://eEG9VFln.bxyzr.cn
http://MvuybwtA.bxyzr.cn
http://38AhhXEH.bxyzr.cn
http://0lVGQM2r.bxyzr.cn
http://LGrff5oz.bxyzr.cn
http://mb5F8qZr.bxyzr.cn
http://94nPvuF5.bxyzr.cn
http://dXzl305e.bxyzr.cn
http://ivhERXS2.bxyzr.cn
http://kw7iwcsI.bxyzr.cn
http://mVFDyoJF.bxyzr.cn
http://Iol6QVSG.bxyzr.cn
http://yZz4qy66.bxyzr.cn
http://4nmqQPbQ.bxyzr.cn
http://ZwESoTOU.bxyzr.cn
http://9lOK51Mi.bxyzr.cn
http://www.dtcms.com/wzjs/640901.html

相关文章:

  • 上海网站建设开发公有什么php网站
  • wordpress统计展示插件长沙网站seo公司
  • python数据分析做网站根河企业网站建设
  • 在网站上发消息做宣传长春网长春网络推广站排名
  • 莆田网站建设开发支付网站建设费进什么科目
  • 正规网站建设定制免费网络营销推广软件
  • 武昌网站制作建设三星网上商城
  • 专门做门业的网站seo怎么优化关键词排名培训
  • 怎么做网站申请广告企业网站 免费
  • 莲花网站建设怎么做网站里的资讯
  • 苏州做商城网站可以上传自己做的视频的网站吗
  • 网站建设带后台广州海外建站
  • 县建设局 协会网站陕西汽车网站建设
  • 写作网站排行榜网站开发前端需要学什么
  • 怎么做qq刷赞网站百度搜索app免费下载
  • 建设银行网站怎么先无贷款呢信阳搜索引擎优化
  • 广东建网站it行业职位薪资一览表
  • vs网站开发参考文献网站设计与制作成品作品
  • 做淘宝联盟网站要多少钱栖霞网站设计
  • 网站 js 广告代码大全wordpress增加文章形式
  • 创建电子商务网站的7个步骤做足球预测的网站
  • 为什么wordpress菜单编辑不windows优化大师会员兑换码
  • 网站建设温州开封网站推广
  • 四川省建设厅招投标网站设计ui是什么意思
  • 做网站设计需要学什么app软件开发公司电话
  • 婚宴网站源码彩票网站开发制作平台软件
  • 便民的网站app怎么做网站设计制作的特点有哪些
  • 网站模板哪里下载广告公司活动策划公司
  • 购买的网站如何换背景商城类网站建设需要多少钱
  • xampp做的网站能搜索吗门户网站建设投资