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

13-21-普通数组、矩阵

LeetCode 热题 100

文章目录

  • LeetCode 热题 100
  • 普通数组
    • 13. 中等-最大子数组和
    • 14. 中等-合并区间
    • 15. 中等-轮转数组
    • 16. 中等-除自身以外数组的乘积
    • 17. 困难-缺失的第一个正数
  • 矩阵
    • 18. 中等-矩阵置零
    • 19. 中等-螺旋矩阵
    • 20. 中等-旋转图像
    • 21. 中等-搜索二维矩阵II

本文存储我刷题的笔记。


普通数组

13. 中等-最大子数组和

我的思路

  • 思路:从第一个非负数开始,不断向右扩大窗口更新最大值;若当前窗口为负,则继续从下一个正数开始滑动窗口。

  • 时间96ms(50.51%),内存64.89MB(56.76%)。

class Solution {
public:int maxSubArray(std::vector<int>& nums) {int len = nums.size();// 寻找到第一个非负数int left{ -1 };int max_tmp{ nums[0] };while (left < len - 1 && nums[++left] < 0) {max_tmp = std::max(max_tmp, nums[left]);}// 向右扩大窗口,不断记录最大值,直到和为负或遍历完成int sum{ 0 };for (int i = left; i < len; i++) {sum += nums[i];max_tmp = std::max(max_tmp, sum);// 若当前和为负则重新找下一个正数if (sum < 0) {while (i < len - 1 && nums[++i] < 0) {}if (i == len - 1) {return std::max(max_tmp, nums[i]);}--i;sum = 0;}}return max_tmp;}
};

官方思路一:动态规划

  • 思路:类似于滚动数组的思想。若使用 p r e ( i ) pre(i) pre(i) 表示以下标 i i i 为结尾的“连续子数组最大和”,显然我们只需要滚动遍历寻找 max ⁡ 0 ≤ i ≤ n − 1 { p r e ( i ) } \max_{0 \le i \le n-1}\{ pre(i)\} max0in1{pre(i)} 即可。那每一步如何计算 p r e ( i ) pre(i) pre(i) 呢?可以使用递推的思想,也就是: p r e ( i ) = max ⁡ { p r e ( i − 1 ) + nums [ i ] , nums [ i ] } 且 p r e ( 0 ) = nums [ 0 ] pre(i) = \max \{ pre(i-1) + \textit{nums}[i], \textit{nums}[i] \} \; 且 \; pre(0) = \textit{nums}[0] pre(i)=max{pre(i1)+nums[i],nums[i]}pre(0)=nums[0]
  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n nums \textit{nums} nums 数组的长度。我们只需要遍历一遍数组即可求得答案。
  • 空间复杂度: O ( 1 ) O(1) O(1)。我们只需要常数空间存放若干变量。
  • 时间80ms(92.74%),内存64.91MB(55.59%)。
class Solution {
public:int maxSubArray(vector<int>& nums) {int pre = 0, maxAns = nums[0];for (const auto &x: nums) {pre = max(pre + x, x);     // 求解本步骤的pre(i)maxAns = max(maxAns, pre); // 求解最大值}return maxAns;}
};

官方思路二:分治

  • 思路:我们想通过定义一个递归函数 get(nums,l,r)表示查询 nums序列[l,r]区间 的最大子段和,于是 get(nums,0,nums.size()-1)就可以直接完成题目。每次查询时,都将区间拆成左右两个子区间 [ l , m ] [l,m] [l,m] [ m + 1 , r ] [m+1,r] [m+1,r] m = ⌊ l + r 2 ⌋ m = \lfloor \frac{l + r}{2} \rfloor m=2l+r),直到子区间长度为1,然后再逐级根据两个子区间的信息返回当前子区间的信息。每个区间的“信息”包括四个:
  • lSum \textit{lSum} lSum 表示 [ l , r ] [l,r] [l,r] 内以 l l l 为左端点的最大子段和
  • rSum \textit{rSum} rSum 表示 [ l , r ] [l,r] [l,r] 内以 r r r 为右端点的最大子段和
  • mSum \textit{mSum} mSum 表示 [ l , r ] [l,r] [l,r] 内的最大子段和
  • iSum \textit{iSum} iSum 表示 [ l , r ] [l,r] [l,r] 的区间和

显然区间长度为1时,四个量都等于序列值。区间长度大于1时:

  • 首先最好维护的是 iSum \textit{iSum} iSum,区间 [ l , r ] [l,r] [l,r] iSum \textit{iSum} iSum 就等于「左子区间」的 iSum \textit{iSum} iSum 加上「右子区间」的 iSum \textit{iSum} iSum
  • 对于 [ l , r ] [l,r] [l,r] lSum \textit{lSum} lSum,存在两种可能,它要么等于「左子区间」的 lSum \textit{lSum} lSum,要么等于「左子区间」的 iSum \textit{iSum} iSum 加上「右子区间」的 lSum \textit{lSum} lSum,二者取大。
  • 对于 [ l , r ] [l,r] [l,r] rSum \textit{rSum} rSum,同理,它要么等于「右子区间」的 rSum \textit{rSum} rSum,要么等于「右子区间」的 iSum \textit{iSum} iSum 加上「左子区间」的 rSum \textit{rSum} rSum,二者取大。
  • 当计算好上面的三个量之后,就很好计算 [ l , r ] [l,r] [l,r] mSum \textit{mSum} mSum 了。我们可以考虑 [ l , r ] [l,r] [l,r] mSum \textit{mSum} mSum 对应的区间是否跨越 m m m——它可能不跨越 m m m,也就是说 [ l , r ] [l,r] [l,r] mSum \textit{mSum} mSum 可能是「左子区间」的 mSum \textit{mSum} mSum 和 「右子区间」的 mSum \textit{mSum} mSum 中的一个;它也可能跨越 m m m,可能是「左子区间」的 rSum \textit{rSum} rSum 和 「右子区间」的 lSum \textit{lSum} lSum 求和。三者取大。
  • 时间92ms(63.50%),内存64.87MB(59.37%)。

力扣官方 注:这个分治方法类似于「线段树求解最长公共上升子序列问题」的 pushUp操作。 也许读者还没有接触过线段树,没有关系,方法二的内容假设你没有任何线段树的基础。当然,如果读者有兴趣的话,推荐阅读线段树区间合并法解决多次询问的「区间最长连续上升序列问题」和「区间最大子段和问题」,还是非常有趣的。

class Solution {
public:// 每个区间[l,r]都定义了四种量struct Status {int lSum, // 区间[l,r]内,以 l 为左端点的最大子段和rSum, // 区间[l,r]内,以 r 为右端点的最大子段和mSum, // 区间[l,r]内的最大子段和iSum; // 区间[l,r]的区间和};// 根据左右子区间的信息,计算当前区间的信息Status pushUp(Status l, Status r) {int iSum = l.iSum + r.iSum;int lSum = std::max(l.lSum, l.iSum + r.lSum);int rSum = std::max(r.rSum, r.iSum + l.rSum);int mSum = std::max(std::max(l.mSum, r.mSum), l.rSum + r.lSum);return Status { lSum, rSum, mSum, iSum };};// 分治法:采用递归思想Status get(std::vector<int>& a, int l, int r) {// 长度为1,直接返回if (l == r) {return Status { a[l], a[l], a[l], a[l] };}// 将区间对半分,递归寻找每个子区间的信息int m = (l + r) >> 1;           // 区间的中点Status lSub = get(a, l, m);     // 左子区间Status rSub = get(a, m + 1, r); // 右子区间return pushUp(lSub, rSub);      // 根据左右子区间信息,计算当前区间最大字段和}// 主函数int maxSubArray(std::vector<int>& nums) {return get(nums, 0, nums.size() - 1).mSum;}
};

14. 中等-合并区间

15. 中等-轮转数组

16. 中等-除自身以外数组的乘积

17. 困难-缺失的第一个正数

矩阵

18. 中等-矩阵置零

19. 中等-螺旋矩阵

20. 中等-旋转图像

21. 中等-搜索二维矩阵II

我的思路

  • 思路

  • 时间??ms(??%),内存??MB(??%)。


官方思路:

  • 思路

  • 时间??ms(??%),内存??MB(??%)。


相关文章:

13-21-普通数组、矩阵

LeetCode 热题 100 文章目录 LeetCode 热题 100普通数组13. 中等-最大子数组和14. 中等-合并区间15. 中等-轮转数组16. 中等-除自身以外数组的乘积17. 困难-缺失的第一个正数 矩阵18. 中等-矩阵置零19. 中等-螺旋矩阵20. 中等-旋转图像21. 中等-搜索二维矩阵II 本文存储我刷题的…...

代码随想录算法训练营第四十六天【动态规划part08】 | 139.单词拆分、背包总结

139.单词拆分 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 单词是物品&#xff0c;字符串s是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。 动规五部曲 确定dp数…...

go语言基础 break和contine区别

背景 break和continue是编程语言的标准语法&#xff0c;几乎在所有的语言都有类似的用法。 go语言及所有其他编程语言for循环或者其他循环 区别 for i : 0; i < 10; i {if i 5 {continue}fmt.Println(i)for j : 0; j < 3; j {fmt.Println(strconv.Itoa(j) "a&q…...

vue3父子组件通过$parent与ref通信

父组件 <template><div><h1>ref与$parents父子组件通信 {{ parentMoney }}</h1><button click"handler">点击我子组件的值会减20</button><hr><child ref"children"></child></div> </te…...

PHP中的常见的超全局变量

PHP是一种广泛使用的服务器端脚本语言&#xff0c;它被用于开发各种Web应用程序。在PHP中&#xff0c;有一些特殊的全局变量&#xff0c;被称为超全局变量。超全局变量在整个脚本中都是可用的&#xff0c;无需使用global关键字来访问它们。在本文中&#xff0c;我们将深入了解P…...

leetcode9.回文数

回文数 0.题目1.WJQ的思路2.实现过程2.0 原始值怎么一个个取出来&#xff1f;2.1 取出来的数如何存到新的数字后面&#xff1f;2.2完整的反转得到新数的过程 3.完整的代码4.可运行的代码5.算法还可以优化的部分 0.题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&…...

springboot(ssm大学生二手电子产品交易平台 跳蚤市场系统Java(codeLW)

springboot(ssm大学生二手电子产品交易平台 跳蚤市场系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或…...

关于微信小程序中如何实现数据可视化-echarts动态渲染

移动端设备中&#xff0c;难免会涉及到数据的可视化展示、数据统计等等&#xff0c;本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染&#xff0c;实现数据可视化功能。 基础使用 首先在GitHub上下载echarts包 地址&#xff1a;https://github.com/ecomfe/echarts-for…...

在Windows WSL (Linux的Windows子系统)上运行的Ubuntu如何更改主机名

在Windows 安装的Ubuntu&#xff0c;如何修改主机名。有列了两种方法&#xff0c;提供给大家参照。 文章目录 方法一&#xff1a;hostname指令修改方法二&#xff1a;修改配置文件修改hostnanmewsl.conf 文件配置选项推荐阅读 方法一&#xff1a;hostname指令修改 hostname指…...

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…...

网络入门---网络的大致了解

目录标题 网络发展的简单认识协议作用的理解协议的本质什么是协议分层网络通信所面对的问题OSI七层模型TCP/IP模型协议报头的理解局域网通信局域网通信基本原理报头的问题局域网的特点跨网的网络链接如何查看mac地址 网络发展的简单认识 通过之前的学习我们知道计算机是给人提…...

构建沉浸式 AI 文本编辑器:开源 3B 编辑器的设计原则与思路

借助于在 AutoDev 与 IDE 上的 AI 沉浸式体验设计&#xff0c;我们开始构建一个 AI 原生的文本编辑器&#xff0c;以探索沉浸式创作体验。其适用于需求编写、架构文档等等文档场景&#xff0c;以加速软件开发中的多种角色的日常工作。 GitHub&#xff1a;https://github.com/un…...

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶上)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、数据…...

[每周一更]-(第74期):Docker-compose 部署Jenkins容器-英文版及错误纠错

1、前文概要 通过物理机部署Jenkins前文已经讲过&#xff08;地址&#xff1a;[Jenkins] 物理机 安装 Jenkins&#xff09;&#xff0c;也已经公司内部平稳运行若干年&#xff0c;考虑到容器化的使用场景&#xff0c;部分项目都采用容器运行&#xff0c;开始考虑部署容器化的J…...

MySQL日期函数sysdate()与now()的区别,获取当前时间,日期相关函数

select sleep(2) as datetime union all select sysdate() -- sysdate() 返回的时间是当前的系统时间&#xff0c;而 now() 返回的是当前的会话时间。 union all select now() -- 等价于 localtime,localtime(),localtimestamp,localtimestamp(),current_timestamp,curre…...

邦芒解析:面试怎么谈自身优缺点

在面试时&#xff0c;当被问到你的优缺点时&#xff0c;你可以这样回答&#xff1a; 优点&#xff1a; 我的工作能力强&#xff0c;能够高效地完成任务。我对技术有热情&#xff0c;喜欢学习新的技能和知识。我善于沟通&#xff0c;能够与不同背景的人进行有效沟通。我注重细节…...

【libGDX】加载G3DJ模型

1 前言 libGDX 提供了自己的 3D 格式模型文件&#xff0c;称为 G3D&#xff0c;包含 g3dj&#xff08;Json 格式&#xff09;和 g3db&#xff08;Binary 格式&#xff09;文件&#xff0c;官方介绍见 → importing-blender-models-in-libgdx。 对于 fbx 文件&#xff0c;libGDX…...

0基础学习VR全景平台篇第123篇:VR视频航拍补天 - PR软件教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好&#xff0c;今天我们来介绍【航拍VR视频补天】。之前已经教给了大家如何处理航拍图片的补天&#xff0c;肯定有很多小伙伴也在好奇&#xff0c;航拍的VR视频…...

webpack打包三方库直接在html里面使用

场景&#xff1a;我是小程序中使用wxmp-rsa库进行加密&#xff0c;然后在html里面解密 我就想把wxmp-rsa库打包到一个js里面&#xff0c;然后在html里面直接引入使用。 webpack配置 const path require("path"); const MiniCssExtractPlugin require("mini-…...

Redis使用increment方法返回null的原因以及解决方案

public static void main(String[] args) {redisTemplate.setEnableTransactionSupport(true); //开启事务支持redisTemplate.multi(); //标记事务块的开始redisTemplate.opsForValue().set("name","zs");redisTemplate.opsForValue().set("pass&qu…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...