[代码随想录打卡]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.mzph.cn/pingmian/58962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3的router和Vuex的学习笔记整理

一、路由的基本搭建 1、安装 npm install vue-router --registryhttps://registry.npmmirror.com 2、配置路由模块 第一步&#xff1a;src/router/index.js创建文件 第二步&#xff1a;在src/view下面创建两个vue文件&#xff0c;一个叫Home.vue和About.vue 第三步&#x…

探索React源码:React Diff

本篇文章我们来了解一下Diff算法的实现过程。 相关概念 React中的各种节点 假设当前存在一个DOM节点&#xff0c;触发了一次更新&#xff0c;那么在协调的过程中&#xff0c;会有四种节点和该节点相关联&#xff1a; 该DOM节点本身。 workInProgress fiber&#xff0c;更新过程…

安装fpm,解决*.deb=> *.rpm

要从生成 .deb 包转换为 .rpm 包&#xff0c;可以按照以下步骤修改打包脚本 1. 使用 fpm 工具 fpm 是一个强大的跨平台打包工具&#xff0c;可以将 .deb 包重新打包成 .rpm&#xff0c;也可以直接从源文件打包成 .rpm。 安装 fpm sudo apt-get install ruby-dev sudo gem in…

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍&#xff1a;4、程序编写&#xff1a; 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍&#xff1a;4、程…

深入理解Transformer中的位置编码

1 位置编码的作用 由于注意力的作用机制&#xff0c;不论输入序列的顺序如何&#xff0c;输出结果都是一样的。 也就是丢失了位置信息。 但是对于语言模型&#xff0c; 我们都知道顺序是很重要的&#xff0c; 所以需要对输入序列额外注入位置信息。 2 位置编码方式 Transfor…

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

Git - 两种方式撤销已提交到远端仓库的记录并删除提交记录

文章目录 命令行方式附 命令行方式 确定要撤销的提交记录 首先&#xff0c;使用以下命令查看提交历史&#xff1a; git log找到想撤销的提交记录的哈希值&#xff08;SHA&#xff09; &#xff0c;比如9c9c98d6f7f28c41d971f8efd51ed31f9720792c 撤销提交记录 根据需求选择以下…

vscode markdown-image 图片粘贴自动上传到本地目录设置

.vscode/settings.json文件内容 {"markdown-image.base.fileNameFormat": "${hash}-${YY}${MM}${DD}-${HH}${mm}${ss}","markdown-image.local.path": "./images","markdown-image.base.uploadMethod": "Local",…

Linux入门-基础指令和权限

1.压缩打包 1.1压缩是什么 压缩是通过特定的算法&#xff0c;使文件减小体积&#xff0c;从而达到节省空间的目的。 1.2.为什么要压缩 a.压缩将文件大小减小&#xff0c;在本地可能不太明显&#xff0c;但是在网络传输中&#xff0c;减小了网络传输的成本。 b.将多个文件压…

大数据新视界 -- 大数据大厂之 Impala 性能优化:解锁大数据分析的速度密码(上)(1/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

docker pull 拉取镜像失败,使用Docker离线包

1、登录并注册Github&#xff0c;然后在Github中搜索并打开“wukongdaily/DockerTarBuilder” 项目&#xff0c;在该项目主页点击“Fork”。 然后点 “Create Fork”&#xff0c;将项目创建到自己的Github主页。 2、接着在自己创建过来的这个项目中点击“Actions” 3、然后…

HTTP和HTTPS到底啥区别?不只是差一个“S”这么简单.....

在信息时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。我们每天浏览网页、发送邮件、进行网络购物&#xff0c;都离不开网络数据的传输。 而保障这些数据在传输过程中的安全&#xff0c;就显得尤为重要。 HTTP和HTTPS作为两种应用层协议&#xff0c;在网络数据传…

微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)

微服务设计模式 - 发布订阅模式&#xff08;Publisher Subscriber Pattern&#xff09; 定义 发布-订阅模式&#xff08;Publisher-Subscriber Pattern&#xff09;是一种常见的设计模式&#xff0c;被广泛用于云计算和分布式系统中&#xff0c;以实现松散耦合的组件间通信。发…

0xGame 2024 [Week 4] Jenkins

1.前言 由于好久没做web题了&#xff0c;所以今天来尝试来做一波web题&#xff0c;仅供刷题记录。 2.题目 这个给的提示对于小白来说实在是友好的过劲。 3.分析 上网搜到一个关于Jenkins的历史漏洞&#xff0c;下面链接可供参考 https://blog.csdn.net/2301_80127209/arti…

yolov8训练及测试(ubuntu18.04、tensorrt、ros)

1 数据集制作 1.1标注数据 Linux/Ubuntu/Mac 至少需要 Python 2.6 &#xff08;推荐使用 Python 3 或更高版本 及 PyQt5&#xff09; Ubuntu Linux (Python 3 Qt5) git clone https://gitcode.com/gh_mirrors/la/labelImg.git sudo apt-get install pyqt5-dev-tools cd lab…

Nginx 反向代理(解决跨域)

文章目录 前言一、同源策略二、跨域是什么&#xff1f;三、Nginx解决跨域1.前端示例代码2.说明 四、nginx反向代理配置五、启动nginx六、最终效果总结 前言 Nginx反向代理解决跨域 一、同源策略 定义&#xff1a;同源策略&#xff08;Same-Origin Policy&#xff09;是指浏览…

ssm《数据库系统原理》课程平台的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

多渠道流量获取策略提升网站访问量的有效方法

内容概要 在当今数字时代&#xff0c;企业面临着越来越激烈的竞争&#xff0c;流量获取变得极为重要。多渠道流量获取不仅可以增加网站的访问量&#xff0c;还能够有效提升品牌的知名度和影响力。通过整合多种渠道&#xff0c;企业能够更好地触达目标受众&#xff0c;实现精准…

kafka实时返回浏览数据

在安装完kafka(Docker安装kafka_docker 部署kafka-CSDN博客)&#xff0c;查看容器是否启动&#xff1a; docker ps | grep -E kafka|zookeeper 再用python开启服务 from fastapi import FastAPI, Request from kafka import KafkaProducer import kafka import json import …

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装&#xff0c;它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的&#xff0c;而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装&#xff0c;具体实现代码如下&#xff1a; …