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

代码随想录算法训练营第二天| 209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地

209. 长度最小的子数组

题目:

给定一个包含正整数的数组 nums 和一个正整数 target ,找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 ,并返回其长度。如果不存在符合条件的子数组,返回 0

示例:

示例 1:
  • 输入: target = 7, nums = [2,3,1,2,4,3]
  • 输出: 2
  • 解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
  • 输入: target = 4, nums = [1,4,4]
  • 输出: 1
示例 3:
  • 输入: target = 11, nums = [1,1,1,1,1,1,1,1]
  • 输出: 0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

进阶:

如果你已经实现 O(n) 时间复杂度的解法,请尝试设计一个 O(n log(n)) 时间复杂度的解法。


暴力解法:

class Solution {public int minSubArrayLen(int target, int[] nums) {int result = nums.length + 1;int sum = 0;for (int i = 0; i < nums.length; i++) {sum = 0;for (int j = i; j < nums.length; j++) {sum = sum + nums[j];if (sum >= target && result > j - i + 1) {result = j - i + 1;}}}if (result == nums.length + 1) {return 0;} else {return result;}}
}

滑动窗口解法:

class Solution {public int minSubArrayLen(int target, int[] nums) {int result = nums.length + 1;int sum = 0;int left = 0;for (int i = 0; i < nums.length; i++) {sum = sum + nums[i];while (sum >= target) {if (result > i - left + 1) {result = i - left + 1;}sum = sum - nums[left];left++;}}if (result == nums.length + 1) {return 0;} else {return result;}}
}

解题思路:

滑动窗口是一种高效解决连续子数组问题的算法,特别适用于寻找满足特定条件的最小或最大子数组。该方法的核心思想是在遍历数组时维护一个窗口(即子数组),当窗口中的元素和满足目标条件时,缩小窗口的大小以尝试找到更小的子数组。

步骤:

  1. 初始化两个指针 leftright,并使用一个变量 sum 来存储窗口内元素的和。
  2. right 指针向右扩展时,将 nums[right] 加入 sum,形成窗口。
  3. 当窗口内的和大于等于目标 target 时,计算当前窗口长度,并尝试缩小窗口,直到窗口内的和小于 target
  4. 在每次窗口满足条件时更新最小子数组长度。

这种方法的时间复杂度为 O(n),因为每个元素在遍历过程中最多只会被访问两次。


59. 螺旋矩阵 II

题目:

给你一个正整数 n ,生成一个包含 1 到 n^2 的所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵。

示例:

  • 输入: n = 3
  • 输出:
[[1, 2, 3],[8, 9, 4],[7, 6, 5]
]

代码:

class Solution {public int[][] generateMatrix(int n) {int[][] result = new int[n][n];int startx = 0;int starty = 0;int loop = 1;int count = 1;int offset = 1;int i, j;while (loop <= n / 2) {for (j = starty; j < n - offset; j++) {result[startx][j] = count;count++;}for (i = startx; i < n - offset; i++) {result[i][n - offset] = count;count++;}for (j = n - offset; j > startx; j--) {result[n - offset][j] = count;count++;}for (i = n - offset; i > starty; i--) {result[i][starty] = count;count++;}startx++;starty++;offset++;loop++;}if (n % 2 == 1) {result[startx][starty] = count;}return result;}
}

解题思路:

螺旋矩阵是一个典型的二维数组遍历问题,要求我们按照顺时针的顺序填充一个 n x n 的正方形矩阵。可以通过分层的方式,逐步填充矩阵的外圈,并不断收缩到内圈。

步骤:

  1. 通过定义上下左右四个边界(即 startxstartyoffset),按顺时针方向依次填充每层的矩阵元素。
  2. 每次循环都减少边界的范围,直到边界缩小到中心位置。
  3. 如果矩阵的阶数 n 为奇数,最后剩下中心位置需要单独处理。

这是一种逐步推进的方式,按照顺时针方向填充矩阵,每次循环都会将一圈元素填满。

区间和问题

题目描述

给定一个长度为 n 的整数数组,要求计算多个区间的和。每次查询会给出两个整数 ab,表示区间 [a, b],程序需返回该区间内的元素之和。

解题思路

这个问题的核心在于如何高效计算多个区间的和。我们可以通过前缀和技巧来快速处理每次的查询。前缀和数组 p[i] 表示从数组的第一个元素到第 i 个元素的累加和。这样,对于任意区间 [a, b],其区间和可以通过前缀和数组快速计算:

  • 如果 a == 0,则区间和为 p[b],即直接得到从第 0 到第 b 元素的累积和。
  • 如果 a > 0,则区间和为 p[b] - p[a-1],即减去 a 之前的累积和部分。

这种方法将每次查询的时间复杂度从 O(n) 降低到了 O(1),大大提高了性能。

代码实现

import java.util.Scanner;public class ArraySum {public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();  // 读取数组长度int[] vec = new int[n];   // 原始数组int[] p = new int[n];     // 前缀和数组int presum = 0;           // 累积和变量// 构建前缀和数组for(int i = 0; i < n; i++) {vec[i] = input.nextInt();  // 读取数组元素presum += vec[i];p[i] = presum;}// 处理多次区间和查询while(input.hasNextInt()) {int a = input.nextInt();  // 起始位置int b = input.nextInt();  // 结束位置int sum = 0;// 通过前缀和计算区间和if (a == 0) {sum = p[b];} else {sum = p[b] - p[a - 1];}// 输出结果System.out.println(sum);}input.close();}
}

开发商购买土地问题

题目描述

开发商计划购买一块矩形土地,土地被分为 m * n 的格子,每个格子有一个整数表示该格子的价值。开发商希望找到一个方式将该土地划分为两部分,并使得这两部分的价值差最小。程序要求输出最小价值差。

解题思路

该问题可以通过逐步累积和的方式进行解决:

  1. 首先,我们需要计算每行和每列的总价值,这样我们可以比较在每行或每列切分时的两部分价值差。
  2. 对于每行累加求和 xp[i],表示第 i 行的价值总和;对每列累加求和 yp[j],表示第 j 列的价值总和。
  3. 然后逐行和逐列累积行、列的总和,与整体价值总和的差值进行比较,得到最小的差值。

通过这种方法,我们可以通过不断尝试在不同位置切分土地,找到使得两部分价值差最小的位置。

代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);int m = input.nextInt();  // 行数int n = input.nextInt();  // 列数int[][] vec = new int[m][n];  // 土地价值矩阵int[] xp = new int[m];        // 每行累积价值int[] yp = new int[n];        // 每列累积价值int sum = 0;  // 总价值int presum = 0;// 计算每行的累积价值for(int i = 0; i < m; i++) {presum = 0;for (int j = 0; j < n; j++) {vec[i][j] = input.nextInt();sum += vec[i][j];     // 总价值presum += vec[i][j];  // 当前行累积价值}xp[i] = presum;  // 保存当前行的累积价值}// 计算每列的累积价值for (int j = 0; j < n; j++) {presum = 0;for (int i = 0; i < m; i++) {presum += vec[i][j];  // 当前列累积价值}yp[j] = presum;  // 保存当前列的累积价值}int xsum = 0;int result = Integer.MAX_VALUE;// 找出最小行切割差值for (int i = 0; i < m; i++) {xsum += xp[i];result = Math.min(result, Math.abs(sum - 2 * xsum));}int ysum = 0;// 找出最小列切割差值for (int j = 0; j < n; j++) {ysum += yp[j];result = Math.min(result, Math.abs(sum - 2 * ysum));}// 输出结果System.out.println(result);input.close();}
}

相关文章:

代码随想录算法训练营第二天| 209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地

209. 长度最小的子数组 题目&#xff1a; 给定一个包含正整数的数组 nums 和一个正整数 target &#xff0c;找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 示例 1…...

mysql隐藏索引

1. 什么是隐藏索引&#xff1f; 在 MySQL 8 中&#xff0c;隐藏索引&#xff08;Invisible Indexes&#xff09;是指一种特殊类型的索引&#xff0c;它并不真正被删除&#xff0c;而是被标记为“不可见”。当索引被标记为不可见时&#xff0c;查询优化器在生成查询计划时将忽略…...

etcd入门到实战

概述&#xff1a;本文将介绍etcd特性、使用场景、基本原理以及Linux环境下的实战操作 入门 什么是etcd&#xff1f; etcd是一个分布式键值存储数据库 关键字解析&#xff1a; 键值存储&#xff1a;存储协议是 key—value 的形式&#xff0c;类似于redis分布式&#xff1a;…...

Build an Android project and get a `.apk` file on a Debian 11 command line

You can build an Android project and get a .apk file on a Debian 11 command line without using Android Studio. The process involves using the Android SDK command-line tools (sdkmanager, adb, and gradle). Here’s a step-by-step guide to building the ???…...

解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【解读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【解读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…...

Vivado HLS学习

视频链接: 6课&#xff1a;数据类型的转换_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bt41187RW?spm_id_from333.788.videopod.episodes&vd_sourcea75d5585c5297210add71187236ec90b&p6 目录 1.数据类型的转换 2.自动类型转换 2.1隐式数据转换 2.2…...

一款AutoXJS现代化美观的日志模块AxpLogger

简介 Axp Logger是一款基于autox.js的现代化日志模块&#xff0c;具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式&#xff08;不影响脚本运行&#xff09;监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…...

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…...

Spark的安装配置及集群搭建

Spark的本地安装配置&#xff1a; 我们用scala语言编写和操作spark&#xff0c;所以先要完成scala的环境配置 1、先完成Scala的环境搭建 下载Scala插件&#xff0c;创建一个Maven项目&#xff0c;导入Scala依赖和插件 scala依赖 <dependency><groupId>org.scal…...

网络编程基础-IO模型深入理解

一、IO的基本概念 什么是IO&#xff1f; I/O就是计算机内存与外部设备之间拷贝数据的过程 什么是网络IO&#xff1f; 网络IO是指在计算机网络环境中进行的输入和输出操作&#xff0c;涉及数据在网络设备之间的传输。 网络IO操作可以是发送请求、接收响应、下载文件、传输数…...

go 语言学习路线图(一)

1. Go语言简介 Go语言的历史背景和设计理念Go的优势&#xff1a;简洁、高效、并发支持强Go的应用场景&#xff1a;微服务、云计算、系统编程 2. 开发环境设置 安装Go语言开发环境 在Windows、macOS、Linux系统上的安装方法 配置环境变量&#xff1a;GOROOT 和 GOPATH验证安装…...

前端自动化部署,Netlify免费满足你

1 Netlify 介绍 为什么推荐 Netliy &#xff0c; 主要还是穷&#xff0c;Netlify 免费太香了 Netlify you优势100GB 内免费 &#xff0c;满足个人日常 需求&#xff0c;操作,兼容性绑定代码仓库&#xff0c;提交代码自动部署 支持 github , gitlab 等 大多常用代码仓库易操作只…...

Linux的开发工具gcc Makefile gdb的学习

一&#xff1a;gcc/g 1. 1 背景知识 1. 预处理&#xff08;进行宏替换) 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结…...

基于SSM出租车管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;车辆管理&#xff0c;驾驶员管理&#xff0c;基础数据管理&#xff0c;公告管理 驾驶员账号功能包括&#xff1a;系统首页&#xff0c;学生管理&#xff0c;车辆管理&#xff0c;公告管理 开发系统&a…...

iPhone照片内存怎么清理,参考这些方法

随着拍摄数量的增加&#xff0c;许多iPhone用户常常发现自己的手机存储空间不足&#xff0c;而照片无疑是占用空间的罪魁祸首之一。清理这些照片不仅能释放存储空间&#xff0c;还能提升设备的运行速度。小编将分享一些iPhone照片内存怎么清理的高效策略&#xff0c;助你告别冗…...

【Triton教程】向量相加

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境&#xff0c;以高效编写自定义 DNN 计算内核&#xff0c;并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 在本教程中&#xff0c;你将使…...

关于CSS中毛玻璃和滤镜使用总结

【1】毛玻璃 毛玻璃效果&#xff08;也称为磨砂玻璃效果&#xff09;可以通过 CSS 的 backdrop-filter 属性来实现。这个属性允许你在背景上应用各种滤镜效果&#xff0c;从而创建出类似磨砂玻璃的效果。这种效果通常用于创建半透明背景下的模糊效果&#xff0c;使得背景图像或…...

陷入产出危机的我聊聊近况

文章目录 前言我的多重身份作为IT网管作为运维人员作为Web开发人员作为游戏开发人员 总结 前言 在总结文章时&#xff0c;我把自己当做一个内容产出者&#xff0c;当这样一个身份进入每天按部就班的平稳状态时会陷入一种焦虑&#xff0c;产生一种居然没有什么可写的感觉&#…...

HarmonyOS 开发知识总结

1. HarmonyOS 开发知识总结 1.1. resources->base->media中不可以新建文件夹&#xff1f; 项目图片路径resources->base->media中不可以新建文件夹&#xff0c;图片全平级放里面&#xff0c;查找图片不方便&#xff0c;有没有什么其他的办法解决这个难点&#xff…...

[WPF初学到大神] 1. 什么是WPF, MVVM框架, XAML?

什么是WPF? WPF(Windows Presentation Foundation) 包含XAML标记语言和后端代码来开发桌面应用程序的. 用VS新建项目有WPF(.Net Framework和.Net应用程序), 该怎么选? 首选 .NET 应用程序(.NET Core 或 .NET 5/6/7/8新版本)拥有更好的性能、跨平台Windows, Linux, Mac支…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

SpringSecurity+vue通用权限系统

SpringSecurityvue通用权限系统 采用主流的技术栈实现&#xff0c;Mysql数据库&#xff0c;SpringBoot2Mybatis Plus后端&#xff0c;redis缓存&#xff0c;安全框架 SpringSecurity &#xff0c;Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...

论文笔记:Large Language Models for Next Point-of-Interest Recommendation

SIGIR 2024 1 intro 传统的基于数值的POI推荐方法在处理上下文信息时存在两个主要限制 需要将异构的LBSN数据转换为数字&#xff0c;这可能导致上下文信息的固有含义丢失仅依赖于统计和人为设计来理解上下文信息&#xff0c;缺乏对上下文信息提供的语义概念的理解 ——>使用…...