[代码随想录打卡]Day2:209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地 总结

双指针:快慢指针、对撞指针、滑动窗口。相关博客:双指针算法详解(快慢指针、对撞指针、滑动窗口)

209.长度最小的子数组

题目:给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的
子数组
[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
重点:需要明白长度是在哪个指针移动的时候更新的。这个题目中最小子数组的长度是在慢指针移动的时候更新的。
思想:双指针思想,遍历fast指针,然后每次都判断一下当前子数组是否满足题目要求,如果满足就进入while循环。while循环是用来移动slow指针的位置的,先计算子数组长度判断是否对最小长度进行更新,然后更新slow指针的位置。

class Solution {public int minSubArrayLen(int target, int[] nums) {//开始有新的理解了int sum = 0;int ans = 0;for(int slow = 0, fast = 0; fast < nums.length; fast++){//其中j就是快指针sum+=nums[fast];while(sum >= target){if(ans > fast-slow+1 || ans == 0 ){ans = fast-slow+1;}sum -= nums[slow];slow++;}}return ans;}
}
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:slow = 0ans = 0numSum = 0for fast in range(len(nums)):numSum += nums[fast]while(numSum >= target):if(ans > fast-slow+1 or ans == 0):ans = fast - slow +1numSum -= nums[slow]slow+=1return ans

好像很多乍一看可以用两层for循环进行暴力求解的,都可以试试双指针。就是双指针的初始化的位置,移动的条件需要思考一下,这些是不同的。

59.螺旋矩阵II

题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
在这里插入图片描述
重点:循环不变量。区间定义。(是左闭右闭还是左闭右开,在循环中不要发生变化。)在这个螺旋数组中区间定义就是左闭右开。
思想:一次循环就是一圈,每一圈四个方向。这个循环和上一个循环之间的差异是什么,什么变化了。

class Solution {public int[][] generateMatrix(int n) {int count=1;int offset = 1;int startx = 0;int starty = 0;int i=0, j=0;int[][] nums = new int[n][n];for(int iter=0; iter <n/2;iter++){//转这些圈for(j = starty; j < n-offset;j++){nums[startx][j] = count++; }for(i = startx; i < n-offset; i++){nums[i][j] = count++;}for(; j>starty;j--){nums[i][j] = count++;}for(; i>startx;i--){nums[i][j] = count++;}startx++;starty++;offset++;}if(n%2==1){nums[n/2][n/2] = count;}return nums;}
}

有很多人说就是这个不好的一点就是变量定义的太多,但是我感觉虽然变量定义多,看起来有点冗余,但是好理解。下面是我自己减少了变量后写的。

class Solution {public int[][] generateMatrix(int n) {int count = 1;int i=0, j=0;int[][] matrix = new int[n][n];for(int circles=0; circles < n/2; circles++){for(j=circles; j < n - circles-1; j++){matrix[circles][j] = count++;}for(i=circles; i < n - circles-1; i++){matrix[i][j] = count++;}for(; j > circles; j--){matrix[i][j] = count++;}for(; i > circles; i--){matrix[i][j] = count++;}}if(n%2==1){matrix[n/2][n/2] = count;}return matrix;}
}

下面是python版本,感觉python由于while和for和JAVA,C++不同就得多思考一下,用for的话得思考清楚四个边角的坐标。

class Solution:def generateMatrix(self, n: int) -> List[List[int]]:count = 1q = 0i = 0j = 0matrix = [[0 for _ in range(n)] for _ in range(n)]#转多少圈while(q < n/2):j = qi = qwhile(j < n-q-1):matrix[i][j] = countcount+=1j+=1while(i < n-q-1):matrix[i][j] = countcount+=1i+=1while(j > q):matrix[i][j] = countcount+=1j-=1while(i > q):matrix[i][j] = countcount+=1i-=1q += 1if(n%2 == 1):matrix[i][j] = countreturn matrix

下面是代码随想录上的,我就粘贴一个了。

class Solution:def generateMatrix(self, n: int) -> List[List[int]]:nums = [[0] * n for _ in range(n)]startx, starty = 0, 0               # 起始点loop, mid = n // 2, n // 2          # 迭代次数、n为奇数时,矩阵的中心点count = 1                           # 计数for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从1开始for i in range(starty, n - offset) :    # 从左至右,左闭右开nums[startx][i] = countcount += 1for i in range(startx, n - offset) :    # 从上至下nums[i][n - offset] = countcount += 1for i in range(n - offset, starty, -1) : # 从右至左nums[n - offset][i] = countcount += 1for i in range(n - offset, startx, -1) : # 从下至上nums[i][starty] = countcount += 1                startx += 1         # 更新起始点starty += 1if n % 2 != 0 :			# n为奇数时,填充中心点nums[mid][mid] = count return nums

区间和

题目描述:给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
重点:前缀和。
思想:遍历计算[0,i]的区间的和也就是前缀和, i ∈ [ 0 , l e n ( A r r a y ) − 1 ] i \in[0,len(Array)-1] i[0,len(Array)1]。缀和数组的每个元素存储的是原数组从起始位置到当前位置所有元素的累积和。在输入不同的区间的时候,只需要查询前缀和数组中相应的下标然后进行输出或者减法计算即可。

import java.util.Scanner;public class Main {public static void main(String[] args) {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();}
}

import sys
input = sys.stdin.readdef main():data = input().split()index = 0n = int(data[index])index += 1vec = []for i in range(n):vec.append(int(data[index + i]))index += np = [0] * npresum = 0for i in range(n):presum += vec[i]p[i] = presumresults = []while index < len(data):a = int(data[index])b = int(data[index + 1])index += 2if a == 0:sum_value = p[b]else:sum_value = p[b] - p[a - 1]results.append(sum_value)for result in results:print(result)if __name__ == "__main__":main()

开发商购买土地

重点:前缀和。

数组总结

关键:区间定义(循环不变量)和双指针。
基础:数组定义,存储。

相关的题目、视频和文章

  1. https://leetcode.cn/problems/minimum-size-subarray-sum/
  2. https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
  3. https://www.bilibili.com/video/BV1tZ4y1q7XE/
  4. https://leetcode.cn/problems/spiral-matrix-ii/
  5. https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
  6. https://www.bilibili.com/video/BV1SL4y1N7mV/
  7. https://www.programmercarl.com/kamacoder/0058.%E5%8C%BA%E9%97%B4%E5%92%8C.html
  8. https://www.programmercarl.com/kamacoder/0044.%E5%BC%80%E5%8F%91%E5%95%86%E8%B4%AD%E4%B9%B0%E5%9C%9F%E5%9C%B0.html
  9. https://programmercarl.com/%E6%95%B0%E7%BB%84%E6%80%BB%E7%BB%93%E7%AF%87.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6011.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

list与iterator的之间的区别,如何用斐波那契数列探索yield

问题 list与iterator的之间的区别是什么&#xff1f;如何用斐波那契数列探索yield&#xff1f; 2 方法 将数据转换成list,通过对list索引和切片操作&#xff0c;以及可以进行添加、删除和修改元素。 iterator是一种对象&#xff0c;用于遍历可迭代对象&#xff08;如列表、元组…

就是这个样的粗爆,手搓一个计算器:JSON格式化计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"><label for"jsonInput">输入 JSON 字符串:</label> …

PaddleNLP的FAQ问答机器人

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DDRNet模型创新实现人像分割】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

MySQL——索引

目录 一、磁盘 1.1 在系统软件上&#xff0c;并不直接按照扇区进行IO交互&#xff1a; 1.2 磁盘随机访问与连续访问 1.3 建立共识 二、Page 三、InnoDB 四、MyISAM 五、普通索引 一、磁盘 我们在使用Linux&#xff0c;所看到的大部分目录或者文件&#xff0c;其实就是保…

逆向CTF入门(如何找main)

Hello, world of reverse! start函数它在执行一些初始化操作,如获取命令行参数、获取环境变量值、初始化全局变量等&#xff0c;一切准备工作完成之后&#xff0c;再调用main函数 快速定位关键函数&#xff1a; 长驱直入法&#xff1a;当程序功能非常明确时&#xff0c;从程序…

【react框架之dvajs】官网不维护了,还有旧项目在用需要文档的看过来

文档链接: http://gaofeng222.host3v.club/dva-doc/ github:https://gaofeng222.github.io/dva-doc/ 应该是团队没精力搞了&#xff0c;放弃了这块&#xff01;https://github.com/umijs/umi/discussions/12387

探索魁北克:IT精英的理想移民地

在当今这个数字化时代&#xff0c;IT行业无疑是全球最具活力和发展潜力的领域之一。加拿大&#xff0c;尤其是魁北克省&#xff0c;以其开放的移民政策、优越的工作环境和高质量的生活&#xff0c;成为IT专业人士的理想移民目的地。 一、加拿大IT行业的吸引力 职业发展与稳定性…

Linux(CentOS)安装 Nginx

CentOS版本&#xff1a;CentOS 7 Nginx版本&#xff1a;1.24.0 1、下载 Nginx 打开Nginx官网&#xff1a;https://nginx.org/ 2、上传 Nginx 文件到 CentOS 使用FinalShell远程登录工具&#xff0c;并且使用 root 用户连接登录&#xff08;注意这里说的root用户连接登录是指…

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本&#xff0c;列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令&#xff1a; pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…

Qt字符编码

目前字符编码有以下几种&#xff1a; 1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF)&#xff0c;其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节&#xff0c;当然&#xff0c;也可以更长。 2、UTF-16 UTF-16是Unicode字符编码五层次…

微服务设计模式 - 网关路由模式(Gateway Routing Pattern)

微服务设计模式 - 网关路由模式&#xff08;Gateway Routing Pattern&#xff09; 定义 网关路由模式&#xff08;Gateway Routing Pattern&#xff09;是微服务架构中一种非常重要的设计模式&#xff0c;主要用于在客户端和微服务之间提供一个中间层。这一模式通过中央网关路…

【Axure高保真原型】PDF阅读器

今天和大家分享PDF阅读器的原型模板&#xff0c;我们点击左侧的PDF&#xff0c;点击后右侧能看到这个PDF的内容&#xff0c;每个PDF都可以点击查看&#xff0c;如果PDF内容太多&#xff0c;我们也可以通过鼠标滚动来查看。这个模板是用中继器制作的&#xff0c;所以使用也很方便…

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

漏洞挖掘某电子商城类漏洞挖掘案例教程,手把手教你复现一个完整的漏洞挖掘全流程

前言 电子商城购物系统我们每天都能接触到&#xff0c;现在的商城系统&#xff0c;大多数已经在小程序、APP方向去开发了&#xff0c;因为灵活&#xff0c;方便管理且开发难度不高&#xff0c;当然&#xff0c;现在WEB系统还很多&#xff0c;我们本次会选几个SRC去浅挖一下那些…

C#入门013 表达式,语句详解 2

语句的定义 在计算机编程中&#xff0c;一条语句&#xff08;statement&#xff09;是命令式编程语言中表达某个要执行的动作的最小独立组成部分。用这种语言编写的程序是由一个或多个语句组成的序列构成的。语句可以包含内部组件&#xff0c;比如表达式&#xff08;expressio…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

数据结构之复杂度

hello everybody&#xff0c;好久不见&#xff0c;由于前些日子在学习文件操作&#xff0c;预处理相关知识&#xff0c;导致我好些天没写博客了&#xff0c;所以我先从数据结构开始写吧&#xff0c;等后面熟练些了再补回来&#xff0c;欧克&#xff0c;话不多说&#xff0c;进入…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

Node.js 应用程序中的文件写入提升为 RCE

在这篇博文中,我们将强调代码安全基础的重要性。我们会展示一个技术案例:攻击者如何能够把 Node.js 应用中的文件写入漏洞转化为远程代码执行,即便目标系统的文件系统是以只读方式挂载的。这个技术通过利用暴露的管道文件描述符来获得代码执行能力,从而绕过了这类加固环境中的限…

Oracle视频基础1.4.5练习

1.4.5 看bbk的框架 ls env | grep ORA cd /u01/oradata ls ll cd bbk ll cd /u01/admin/ ll ll bbk cd cd db cd dbs ls vi initbbk.ora clear ls ll env | grep ORA执行创建数据库语句。 sqlplus /nolog conn /as sysdba create spfile from pfile ! ls ll exit startup nom…