代码随想录算法训练营第二天| 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;}}
}
解题思路:
滑动窗口是一种高效解决连续子数组问题的算法,特别适用于寻找满足特定条件的最小或最大子数组。该方法的核心思想是在遍历数组时维护一个窗口(即子数组),当窗口中的元素和满足目标条件时,缩小窗口的大小以尝试找到更小的子数组。
步骤:
- 初始化两个指针
left
和right
,并使用一个变量sum
来存储窗口内元素的和。 - 当
right
指针向右扩展时,将nums[right]
加入sum
,形成窗口。 - 当窗口内的和大于等于目标
target
时,计算当前窗口长度,并尝试缩小窗口,直到窗口内的和小于target
。 - 在每次窗口满足条件时更新最小子数组长度。
这种方法的时间复杂度为 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
的正方形矩阵。可以通过分层的方式,逐步填充矩阵的外圈,并不断收缩到内圈。
步骤:
- 通过定义上下左右四个边界(即
startx
、starty
、offset
),按顺时针方向依次填充每层的矩阵元素。 - 每次循环都减少边界的范围,直到边界缩小到中心位置。
- 如果矩阵的阶数
n
为奇数,最后剩下中心位置需要单独处理。
这是一种逐步推进的方式,按照顺时针方向填充矩阵,每次循环都会将一圈元素填满。
区间和问题
题目描述
给定一个长度为 n
的整数数组,要求计算多个区间的和。每次查询会给出两个整数 a
和 b
,表示区间 [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
的格子,每个格子有一个整数表示该格子的价值。开发商希望找到一个方式将该土地划分为两部分,并使得这两部分的价值差最小。程序要求输出最小价值差。
解题思路
该问题可以通过逐步累积和的方式进行解决:
- 首先,我们需要计算每行和每列的总价值,这样我们可以比较在每行或每列切分时的两部分价值差。
- 对于每行累加求和
xp[i]
,表示第i
行的价值总和;对每列累加求和yp[j]
,表示第j
列的价值总和。 - 然后逐行和逐列累积行、列的总和,与整体价值总和的差值进行比较,得到最小的差值。
通过这种方法,我们可以通过不断尝试在不同位置切分土地,找到使得两部分价值差最小的位置。
代码实现
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. 长度最小的子数组 题目: 给定一个包含正整数的数组 nums 和一个正整数 target ,找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 ,并返回其长度。如果不存在符合条件的子数组,返回 0。 示例: 示例 1…...

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

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

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 开发领域的经典著作,作者 Joshua Bloch 以丰富的经验和深入的知识,全面…...

Vivado HLS学习
视频链接: 6课:数据类型的转换_哔哩哔哩_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的现代化日志模块,具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式(不影响脚本运行)监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…...

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

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

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

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

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

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

基于SSM出租车管理系统的设计
管理员账户功能包括:系统首页,个人中心,车辆管理,驾驶员管理,基础数据管理,公告管理 驾驶员账号功能包括:系统首页,学生管理,车辆管理,公告管理 开发系统&a…...

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

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

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

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

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

[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支…...

matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据
在使用MATLAB批量处理数据时,有时候需要自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个以一定规律命名的变量中,以便于后续通过循环处理每个变量数据。 然而,MATLAB并不支持在变量名中直接使用i来动态生成变量…...

LabVIEW智能可变温循环PCT测试系统
随着全球能源危机的加剧和环境保护需求的提升,开发和利用清洁能源已成为全球必然趋势。氢能作为一种高效的替代能源,正逐步受到关注。然而,储氢技术的研究至关重要,尤其是储氢材料的PCT(Pressure-Composition-Temperat…...

SparkSQL整合Hive
spark-sql可以直接使用hive的元数据 1、环境搭建如下: ## 1、启动hive的元数据服务shell # 1、修改hive的配置文件 cd /usr/local/soft/hive-3.1.3/conf# 2、增加配置 vim hive-site.xml<property> <name>hive.metastore.uris</name> <value…...

Vue 3 和 Vue 2区别
Vue 3 是 Vue 2 的全新升级版本,引入了诸多新的特性,并在性能、开发体验、响应式系统等多个方面进行了改进。以下是 Vue 2 和 Vue 3 的详细对比: 1. 生命周期钩子差异 Vue 3 保留了大部分 Vue 2 的生命周期钩子,但部分名称有所调…...

React.memo和useMemo
React.memo和usememo React.memo React.memo是一个高阶组件,对组件进行性能优化,主要用于优化函数组件的性能,如果一个组件在相同的props下渲染出相同的结果,但是又不需要在组件更新的时候重新渲染,就可以使用react.…...

Android中实现网络请求的方式有哪些?
在Android开发中,实现网络请求是开发过程中不可避免的一部分。随着技术的不断发展,Android中出现了多种实现网络请求的方式,每种方式都有其独特的优缺点。 一、HttpURLConnection HttpURLConnection是Java提供的用于发送HTTP请求的标准类&a…...

安卓13usb触摸唤醒系统 android13触摸唤醒
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 android13在待机后,需要能够使用触摸屏去唤醒我们的系统,这就需要我们修改系统的相关配置了。 2.问题分析 对于这个问题,我们需要知道安卓的事件分发,通过事件分发,…...

c++常用库函数
一.sort排序 快排的改进算法,评价复杂度为(nlogn). 1.用法 sort(起始地址,结束地址下一位,*比较函数) [起始地址,结束地址) (左开右闭) #include<bits/stdc.h> using namespace std; int main() {//sortvector<int&g…...

CSS 网格布局
网格布局是一个二维布局系统,允许开发者以行和列的形式创建灵活的网络,并将内容放置在网络的单元格中。有些元素可能只占据网络的一个单元,另一些元素则可能占据多行或多列。 网格的大小既可以精确定义,也可以根据自身内容自动计…...

python实现屏幕录制,录音录制工具
python实现屏幕录制,录音录制工具 一,介绍 Python 实现的屏幕录制和录音录制工具是一个便捷的应用程序,旨在帮助用户同时捕捉计算机屏幕上的活动以及与之相关的音频输出。这个工具尤其针对教育工作者、内容创作者、技术支持人员以及任何需要…...