开始时间10:30

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

文章讲解:https://programmercarl.com/0209.长度最小的子数组.html

视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

题目感想:

题目讲解中很精髓的一句话,滑动窗口其实就是双指针,这个让我很好理解,首先因为要进行滑动,所以我们的循环代表的指针用来决定窗口结束位置,每次right指针向右一动一位,我们就把这一位加入sum,直到sum大于等于目标值,此时我们统计两个指针之间的距离,并和之前保留的距离相比,如果更小则更新最短距离,然后我们需要将sum减去left指针所在的数值,left向右移动一位,之后再进行sum比较的循环,如果小于目标值,则right继续滑动,又将新的数值添加进sum,再次进入sum比较循环,如此反复,直到right指针到了数组末尾无法继续移动;

 int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= s) {
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

文章讲解:https://programmercarl.com/0059.螺旋矩阵II.html

视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

题目感想:

1.首先就是面对循环时一定要遵循循环不变量原则,我的理解是如果有多个循环,然后你又不遵循循环不变量,那么每个循环拿到前一个循环传过来的值的时候,想要进行处理就得又重新写一套逻辑,之后每个循环都需要重新写,而且还不是统一的逻辑,不仅让数据处理的难度大大上升,同时代码的可复用程度大大下降,所以为了降低逻辑设计的复杂度,我们要保证每个变量的更新以及截止是有统一标准的;

2.然后就是我们要确定循环的思路,大体思路是,一圈一圈循环,然后就是每一圈都会有上下左右四个循环,为此,我们需要的循环逻辑有了,然后就是定义所需要的变量,循环的圈数(这里要注意,循环的最大圈数是二维数组阶数/2),遍历用的i,j也就是横纵坐标,每一圈遍历的起始点同时也是用来控制上下左右循环的截止变量,还有控制每圈遍历的长度的offset(其实可以用圈数来,不过单独弄一个变量来表示会更加清楚),最后要考虑特殊情况,也就是二维数组是奇数阶,最中心的那个位置需要我们单独进行填充;

 int[][] nums = new int[n][n];
int startX = 0, startY = 0; // 每一圈的起始点
int offset = 1;
int count = 1; // 矩阵中需要填写的数字
int loop = 1; // 记录当前的圈数
int i, j; // j 代表列, i 代表行; while (loop <= n / 2) { // 顶部
// 左闭右开,所以判断循环结束时, j 不能等于 n - offset
for (j = startY; j < n - offset; j++) {
nums[startX][j] = count++;
} // 右列
// 左闭右开,所以判断循环结束时, i 不能等于 n - offset
for (i = startX; i < n - offset; i++) {
nums[i][j] = count++;
} // 底部
// 左闭右开,所以判断循环结束时, j != startY
for (; j > startY; j--) {
nums[i][j] = count++;
} // 左列
// 左闭右开,所以判断循环结束时, i != startX
for (; i > startX; i--) {
nums[i][j] = count++;
}
startX++;
startY++;
offset++;
loop++;
}
if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值
nums[startX][startY] = count;
}
return nums;
}

区间和

前缀和是一种思维巧妙很实用 而且 很有容易理解的一种算法思想,大家可以体会一下

文章讲解:https://www.programmercarl.com/kamacoder/0058.区间和.html

题目感想:

1.区间和就是输入一个数组然后求某两个索引之间的数字的总和,我们在输入的时候,就对数量进行累加,设定一个sum,每输入一个数字就往区间和数组里面加,加了之后区间和数组的索引就向右移动,如此反复;

2.需要注意的是,如果给的索引是0和某个索引,那直接就能得出来了,不用多说,如果给的是两个非0索引,那我们需要考虑好如何算,如3和7,3所在的数字需要包括在内的,所以我们需要用7的区间和减去2的区间和,理解不了的自己画图就明白了。

3.由于是acm需要自己处理输入输出,这个需要注意一下,下面的代码是基于输入的索引先输入左边的再输入右边的写的,如果需要拓展那就自己加逻辑

4.区间和就是把能算的先进行了计算,简化了后续的遍历统计计算,反应更快了

Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
int[] vec = new int[n];
int[] p = new int[n]; int presum = 0;
for (int i = 0; i < n; i++) {
vec[i] = scanner.nextInt();
presum += vec[i];
p[i] = presum;
} while (scanner.hasNextInt()) {
int a = scanner.nextInt();
int b = scanner.nextInt(); int sum;
if (a == 0) {
sum = p[b];
} else {
sum = p[b] - p[a - 1];
}
System.out.println(sum);
} scanner.close();
}

开发商购买土地

https://www.programmercarl.com/kamacoder/0044.开发商购买土地.html

题目感想:

1.一开始没怎么看懂怎么进行划分,后面才知道只能划一次,要么纵向要么横向,所以我们可以从横纵两个方面分开讨论,看看能不能的出最小的差;

2.土地差值就是土地的总份额-左边的份额=右边的份额,再用右边的份额-左边的份额得出差值,连起来就是土地总份额-左边的份额*2,这是纵向切割的,横向切割的同理可得;

3.统计部分就是先算出每一行和每一列的土地份额,之后在依此比较差值即可;

 Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int sum = 0;
int[][] vec = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
vec[i][j] = scanner.nextInt();
sum += vec[i][j];
}
} // 统计横向
int[] horizontal = new int[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
horizontal[i] += vec[i][j];
}
} // 统计纵向
int[] vertical = new int[m];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
vertical[j] += vec[i][j];
}
} int result = Integer.MAX_VALUE;
int horizontalCut = 0;
for (int i = 0; i < n; i++) {
horizontalCut += horizontal[i];
result = Math.min(result, Math.abs(sum - 2 * horizontalCut));
} int verticalCut = 0;
for (int j = 0; j < m; j++) {
verticalCut += vertical[j];
result = Math.min(result, Math.abs(sum - 2 * verticalCut));
} System.out.println(result);
scanner.close();

代码随想录第二天|数组part02的更多相关文章

  1. 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...

  2. 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  3. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  4. 【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)

    背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包.完全背包.多重背包.分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出 ...

  5. 《代码大全(第二版)》【PDF】下载

    <代码大全(第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382264 内容简介 <代码大全(第2版)>是著 ...

  6. 代码随想录 day0 博客怎么写

    前言 2.25日开始记录自己的博客生涯以及代码随想录训练营的每日内容 一.题目链接怎么找?怎么设置连接? 力扣题目链接1:力扣 二.正文怎么写? 二分查找 算法思路: 二分查找需要保证数组为有序数组同 ...

  7. ruby代码重构第二课

    (文章都是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在第一课里提取出了相通的代码,第二课里就把常量提取出来吧 一般把常量的定义写的对应的app/mo ...

  8. 第一行代码 Android 第二版到货啦

    今日android第一行代码[第二版]已到,收获的季节到了 先看一下封面 书签: 以后就把空闲时间送给它吧 先来看一下本书的目录: 第1章 开始启程--你的第1行Android代码 第2章 先从看得到 ...

  9. 分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小

    原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the co ...

  10. 代码随想录-day1

    链表 今天主要是把链表专题刷完了,链表专题的题目不是很难,基本都是考察对链表的操作的理解. 在处理链表问题的时候,我们通常会引入一个哨兵节点(dummy),dummy节点指向原链表的头结点.这样,当我 ...

随机推荐

  1. 什么是CPU?

    当你用手机刷短视频.用电脑玩游戏,或是使用智能手表查看健康数据时,这些设备的核心"大脑"--CPU(中央处理器)正在默默工作.它是现代计算设备的核心,但很多人对它一知半解.今天我们 ...

  2. 不上苹果的app store,安装ios应用最简单的方法

    不上架appstore,安装app有两种方法,一种是使用企业类型的苹果开发者账号的In house类型的证书和证书profile文件打包,一种是使用个人/公司类型的苹果开发者账号的ad hoc类型的证 ...

  3. 软件测试_Fiddler抓包工具

    多数资料摘抄至 https://www.cnblogs.com/miantest/p/7289694.html 一.在 macOS 下如何安装 (https://www.telerik.com/fid ...

  4. delphi判断字符是否是汉字

    function IsHZ(ch: WideChar): boolean; var i: Integer; begin i := Ord(ch); if (i < 19968) or (i &g ...

  5. 当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系

    <当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系> 引言:一场OOM引发的血案 某个月黑风高的夜晚,监控系统突然发出刺耳的警报--我们的数据发现流水线集体扑街.事后复盘 ...

  6. 客户端“自废武功”背后的深层秘密——CORS跨域是怎么回事?

    客户端"自废武功"背后的深层秘密--CORS跨域是怎么回事? 嘿,对于刚入门的开发新手,你是不是曾经遇到过这样的情况:你正在愉快地开发一个 Web 应用,代码写得热火朝天,前后端配 ...

  7. MySQL-脏页的刷新机制

    MySQL内存结构-缓冲区 MySQL的缓冲区中有数据页,索引页,插入缓冲等等,这个角度是从页的功能来分类的.本小节从另一个视角关注这些页,如果从 是否被修改过(和磁盘不一致) 这个角度来区分这些页, ...

  8. 初识if,if的三种结构

    1.if语句 流程控制语句:通过一语句,来控制程序的执行流程.其中if属于分支结构 2.if语句的第一种格式 . 实操: 3.if的第二种格式 实操: 4.if的第三种格式 实操: 5.注意事项 在i ...

  9. 【Ubuntu】在Ubuntu上安装IDEA

    [Ubuntu]在Ubuntu上安装IDEA 零.前言 最近换了Ubuntu系统,但是还得是要写代码,这样就不可避免地用到IDEA,接下来介绍一下如何在Ubuntu上安装IDEA. 壹.下载 这一步应 ...

  10. DeepSeek 聊天机器人项目

    想要更深入玩转聊天机器人开发? 推荐本文档 + 课程<DeepSeek 聊天机器人项目>一起学习,效果翻倍! 边学边练,轻松打造智能对话系统~ (๑•̀ㅂ•́)و✧ 快上车,AI 之旅发车 ...