算法刷题-数组

算法刷题

209. 长度最小的子数组-二分或者滑动窗口

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0

思路

二分:

因为数据都是大于0的,因此数组的前缀和数组是单调增的,

我们遍历每一个元素,二分去小最小的满足s[r]-s[l-1]>=target的位置即可。

时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

或者 :滑动窗口

维护一个变量sum,记录区间的和

两个指针l,r 指向区间的尾巴和头部,每次迭代,将nums[r]加入到sum中,

  • 如果满足sum>=target了,更新res,并且指针l右移,直到不满足sum>=target

代码

二分:

    int minSubArrayLen(int target, vector<int>& nums) {int res=1e6;int n=nums.size();vector<int> s(n+10);for(int i=1;i<=n;i++) s[i]=s[i-1]+nums[i-1];for(int i=1;i<=n;i++){int l=i,r=n;while(l<r){int m=(l+r)>>1;if(s[m]-s[i-1]>=target) r=m;else l=m+1;}if(s[l]-s[i-1]>=target){res=min(res,l-i+1);}}if(res==1e6) res=0;return res;}

滑动窗口:

    int minSubArrayLen(int target, vector<int>& nums) {int res=1e6;int l=0,r=0;int sum=0;int n=nums.size();for(;r<n;r++){sum+=nums[r];while(sum>=target) res=min(res,r-l+1),sum-=nums[l++];}if(res==1e6) res=0;return res;}

904. 水果成篮-滑动窗口

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

思路

滑动窗口:
定义两个指针:指向区间的开始和结尾

开一个哈希表来记录区间内每个元素出现的次数,

如果哈希表的长度大于2了,那么就从左边开始删

注意当哈希表内没有这个元素的时候,需要删除key

代码

    int totalFruit(vector<int> &fruits) {int n = fruits.size();map<int, int> mp;int l = 0, res = 0;for (int r = 0; r < n; r++) {mp[fruits[r]]++;while (mp.size() > 2) {auto it= mp.find(fruits[l]);it->second--;if (mp[fruits[l]] == 0) mp.erase(it);l++;}res = max(res, r - l + 1);}return res;}

76. 最小覆盖子串-滑动窗口

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

思路

滑动窗口:

开两个哈希表,tt记录t中每个字符出现的次数,ss记录窗口中每个字符出现的次数

遍历字符串的右端点,每次去check是不是满足tt的字符包含于ss的字符个数。

如果满足,那么就可以不断缩小左端点,更新答案

时间复杂度为 O ( 26 n ) O(26n) O(26n)

代码

    string minWindow(string s, string t) {int n = s.size();map<int, int> tt, ss;for (char c: t) tt[c]++;int len = 1e6, ansL = -1;int l = 0, r = -1;auto check = [&]() -> bool {for (auto [x, y]: tt) {if (ss[x] < y) return false;}return true;};while (r < n) {if (tt.find(s[++r]) != tt.end()) ss[s[r]]++;while (check() && l <= r) {if (r - l + 1 < len) {len = r - l + 1;ansL = l;}if (tt.find(s[l]) != tt.end()) ss[s[l]]--;l++;}}string res = "";if (ansL != -1) res = s.substr(ansL, len);return res;}

59. 螺旋矩阵 II-模拟

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

思路

按照题目模拟即可

代码

vector<vector<int>> generateMatrix(int n) {int l=0,r=n-1,b=n-1,t=0;vector<vector<int>> res(n,vector<int>(n));int num=1,tar=n*n;while(num<=tar){for(int i=l;i<=r;i++) res[t][i]=num++;t++;for(int i=t;i<=b;i++) res[i][r]=num++;r--;for(int i=r;i>=l;i--) res[b][i]=num++;b--;for(int i=b;i>=t;i--) res[i][l]=num++;l++;}return res;}

54. 螺旋矩阵-模拟

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路

模拟。

代码

    vector<int> spiralOrder(vector<vector<int>>& matrix) {int n=matrix.size(),m=matrix[0].size();vector<int> res;int l=0,r=m-1,t=0,b=n-1;int sum=n*m;while(sum){for(int i=l;i<=r;i++) res.push_back(matrix[t][i]),sum--;if(++t>b) break;for(int i=t;i<=b;i++) res.push_back(matrix[i][r]),sum--;if(--r<l) break;for(int i=r;i>=l;i--) res.push_back(matrix[b][i]),sum--;if(--b<t) break;for(int i=b;i>=t;i--) res.push_back(matrix[i][l]),sum--;if(++l>r) break;}return res;}

LCR 146. 螺旋遍历二维数组-模拟

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历:从左上角开始,按照 向右向下向左向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

示例 1:

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

示例 2:

输入:array  = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

思路

模拟

代码

    vector<int> spiralArray(vector<vector<int>>& a) {vector<int> res; if(a.empty()) return res;int n=a.size(),m=a[0].size();int l=0,t=0,r=m-1,b=n-1;while(1){for(int i=l;i<=r;i++) res.push_back(a[t][i]);if(++t>b) break;for(int i=t;i<=b;i++) res.push_back(a[i][r]);if(--r<l) break;for(int i=r;i>=l;i--) res.push_back(a[b][i]);if(--b<t) break;for(int i=b;i>=t;i--) res.push_back(a[i][l]);if(++l>r) break;}return res;}

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

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

相关文章

进制转换(二进制、八进制、十进制、十六进制)

目录 一&#xff1a;十进制转换为二进制、八进制、十六进制 &#xff08;1&#xff09;整数转换 &#xff08;2&#xff09;小数转换 1&#xff09;十进制转二进制 2&#xff09;十进制转八进制 3&#xff09;十进制转十六进制 二&#xff1a;二进制、八进制、十六进制转…

Python使用scapy库监听指定的网卡数据并转发

监听指定网卡中的数据&#xff08;UDP&#xff09;数据转发 具体实现代码如下&#xff1a; from scapy.all import * from scapy.layers.inet import UDP, IP from scapy.layers.l2 import Etherdef Callback(packet):# 目的IPdst_ip packet[IP].dst# 源IPsrc_ip packet[IP]…

【大模型应用开发教程】02_LangChain介绍

LangChain介绍 什么是 LangChain1. 模型输入/输出2. 数据连接3. 链&#xff08;Chain&#xff09;4. 记忆&#xff08;Meomory&#xff09;5. 代理&#xff08;Agents&#xff09;6.回调&#xff08;Callback&#xff09;在哪里传入回调 ?你想在什么时候使用这些东西呢&#x…

Stable diffusion的一些参数意义及常规设置

在线stabel Diffusion模型 https://huggingface.co/spaces/stabilityai/stable-diffusion 随机种子 seed 如果想要同一个文本提示&#xff0c;生成多次都是同一图像&#xff0c;可以设置一个随机种子&#xff0c;类似于random.seed()的原理&#xff0c;并将生成器传递给管道…

A_搜索(A Star)算法

A*搜索(A Star) 不同于盲目搜索&#xff0c;A算法是一种启发式算法(Heuristic Algorithm)。 上文提到&#xff0c;盲目搜索对于所有要搜索的状态结点都是一视同仁的&#xff0c;因此在每次搜索一个状态时&#xff0c;盲目搜索并不会考虑这个状态到底是有利于趋向目标的&#x…

​CUDA学习笔记(五)GPU架构

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 GPU架构 SM&#xff08;Streaming Multiprocessors&#xff09;是GPU架构中非常重要的部分&#xff0c;GPU硬件的并行性就是由SM决定的。 以Fermi架构为例&#xff0c;其包含以下主要组成…

Webpack 理解 input output 概念

一、介绍 如果还没用过 Webpack 请先阅读 Webpack & 基础入门 再回头看本文。 Webpack 的核心只做两件事&#xff0c;输入管理&#xff08;Input Management&#xff09;和输出管理&#xff08;Output Management&#xff09;&#xff0c;什么花里胡哨的插件和配置都离不…

代码随想录打卡第四十六天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一…

学习笔记2——Nosql

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/194205.html 跟学链接 跟学视频链接&#xff1a;https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from333.999.0.0 &#xff08;建议有java基础的同学学习或者一直…

解决 Windows 7 激活信息失败报错 0xC004F057

文章目录 步骤一&#xff1a;以管理员身份运行命令提示符步骤二&#xff1a;卸载当前密钥信息步骤三&#xff1a;清除产品密钥信息步骤四&#xff1a;重新启动 Windows Activation Technologies 服务步骤五&#xff1a;重启电脑 &#x1f389;解决 Windows 7 激活信息失败报错 …

【Java 进阶篇】深入理解 Bootstrap 导航条与分页条

Bootstrap 是一个强大的前端框架&#xff0c;为网页和应用程序开发提供了丰富的组件和工具。其中&#xff0c;导航条和分页条是两个常用的组件&#xff0c;用于创建网站的导航和分页功能。本篇博客将深入探讨 Bootstrap 导航条和分页条的使用&#xff0c;适用于那些希望提升网页…

常用Web安全扫描工具合集

漏洞扫描是一种安全检测行为,更是一类重要的网络安全技术,它能够有效提高网络的安全性,而且漏洞扫描属于主动的防范措施,可以很好地避免黑客攻击行为,做到防患于未然。那么好用的漏洞扫描工具有哪些? 1、AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接&#xff1a;武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链&#xff1a; • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

简单宿舍管理系统(springboot+vue)

简单宿舍管理系统&#xff08;springbootvue&#xff09; 1.创建项目1.前端2.数据库3.后端 2.登陆1.前端1.准备工作2.登陆组件3.配置 2.后端1.链接数据库2.创建用户实体类3.数据操作持久层1.配置2.内容3.测试 4.中间业务层1.异常2.业务实现3.测试 5.响应前端控制层 3.前后对接4…

大模型背景下软件工程的机遇与挑战

点击链接了解详情 本文作者&#xff1a;汪晟杰 导语:AISE&#xff08;AI Software Engineering&#xff09;有人说是软件工程 3.0&#xff0c;即基于大模型&#xff08;LLM - Large Language Model&#xff09;时代下的软件工程。那么究竟什么是 AISE&#xff0c;他的发展历程对…

简单的聊一聊如何使用CSS的父类Has选择器

最近的:has()选择器允许您对父元素和其他祖先应用样式&#xff0c;本文将向您展示如何在Web应用程序开发中使用它。 在CSS的世界中&#xff0c;选择器是驱动我们在网页上看到的美丽且响应式设计的工作的马。它们允许开发者根据元素的属性、位置和关系来选择和样式化HTML元素。 …

汽车屏类产品(五):中控IVI车载信息娱乐系统

前言: 车载信息娱乐系统(IVI)的起源可以追溯到20世纪,按钮调幅收音机被认为是第一个功能。从那以后,IVI系统在创造壮观的车内体验方面变得不可或缺,以至于汽车被称为“车轮上的智能手机”。但随着包括自动驾驶汽车在内的汽车技术的进步,以及对个性化体验的需求不断增长…

【合集】Redis——Redis的入门到进阶 结合实际场景的Redis的应用

前言 Redis是一个开源的内存数据结构存储系统&#xff0c;也被称为键值存储系统。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了丰富的操作命令&#xff0c;可以对这些数据结构进行快速的读写操作。Redis具有高性能、高可用性…

Java进阶篇--并发容器之ThreadLocal内存泄漏

目录 ThreadLocal内存泄漏的原因&#xff1f; 改进和优化 cleanSomeSlots方法 expungeStaleEntry方法 replaceStaleEntry方法 为什么使用弱引用&#xff1f; Thread.exit() ThreadLocal内存泄漏最佳解决方案 在使用完毕后立即清理ThreadLocal 使用InheritableThreadL…

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS 0、 界面预览1、IMS注册-SIP中继基本设置界面2、IMS注册-SIP中继呼叫设置3、IMS中继-代理设置界面4、IMS注册-SIP中继状态界面5、IMS注册-SIP中继详细状态界面6、IMS注册-SIP中继代拨号码优先界面 FreeSWITCH界面安装参考&#…