C++刷题笔记(4)——leetcode209、904

article/2025/9/26 18:12:56

题目1:209.长度最小的子数组

在这里插入图片描述

暴力解法

解题思路:
用两个for循环,外层for循环负责做子序列的起点,内层for循环负责遍历数组,寻找符合条件的子序列
然后外层for循环移动子序列的起点,继续再数组中寻找新的符合条件的子序列,并与之前找到的子序列长度做比较

时间复杂度O(n^2)

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int result = INT32_MAX;                                         //给最终的结果赋一个初始值,INT32_MAX=2^31-1int subLength = 0;                                              //子序列的长度for (int i = 0; i < nums.size(); i++) {                         //设置子序列起点为iint sum = 0;                                                //子序列的数值之和,找一轮子序列后对sum值初始化for (int j = i; j < nums.size(); j++) {                     //设置子序列终止位置为jsum += nums[j];                                         //sum += nums[j]相当于 sum= sum + nums[j]if (sum >= target) {                                    //一旦发现子序列和超过了s,更新resultsubLength = j - i + 1;                              //取子序列的长度result = result < subLength ? result : subLength;   //如果结果的值小于新找到的子序列长度,就更新resultbreak;                                              //找符合条件最短的子序列,所以一旦符合条件就break}}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result == INT32_MAX ? 0 : result;}
};

滑动窗口

滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出要想的结果。

以target=7,数组[2,3,1,2,4,3]为例:
在这里插入图片描述
滑动窗口也可以理解为双指针法的一种

从动图中可以看出,首先是起始位置指针不懂,然后终止指针在数组中滑动,寻找符合条件的子数组,如果当前窗口的值大于s,窗口就要向前移动(也就是该缩小了);

移动后如果数组不满足条件,则重复上一步操作,直到找到长度最小的子数组。

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int result = INT32_MAX;int sum = 0;                                    // 滑动窗口数值之和int i = 0;                                      // 滑动窗口起始位置int subLength = 0;                              // 滑动窗口的长度for (int j = 0; j < nums.size(); j++) {         // 滑动窗口终止位置在数组中遍历寻找符合条件的子数组sum += nums[j];// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件while (sum >= s) {subLength = (j - i + 1);               // 取子序列的长度result = result < subLength ? result : subLength;    //更新resultsum -= nums[i++];                      // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)  妙!!!}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result == INT32_MAX ? 0 : result;}
};

题目2:904.水果成篮

在这里插入图片描述
奇怪的题目,难度一下子上来了,读不懂题的话多看看示例,可以理解为求只包含两种元素的最长连续子序列

滑动窗口

解题思路:
题目的标目就很像滑动窗口,找到符合条件的最大窗口
在这里插入图片描述
用滑动窗口遍历fruits,当有新种类的水果进入窗口时:
1.如果窗口中只有一种水果,将这种水果加入arr数组
2.如果有两种水果,更新窗口的左边界,更新arr中水果的种类
3.如果进来了一种新的类型的水果 更新前一种水果的位置
4.更新滑动窗口的最大值


class Solution
{
public:int totalFruit(vector<int>& fruits){int n = fruits.size();unordered_map<int, int> mp;          //unordered_map定义篮子数组,第一个int为数组中的数字、第二个int为数字的个数int ans = 0;                         //滑动窗口大小for (int i = 0, j = 0; j < n; j++)   //用i和j维护滑动窗口 {mp[fruits[j]]++;                 //向篮子中添加种类为j的水果while (mp.size() > 2)            //水果种类大于两种{mp[fruits[i]]--;             //删除先放入篮子中的水果if (mp[fruits[i]] == 0) {    //种类为i的水果数量为0时,删除掉此种类水果mp.erase(fruits[i]);     }i++;                         //更新左边界,更新篮子中水果的种类}ans = max(ans, j - i + 1);       //更新滑动窗口最大值}return ans;}
};

C++ STL unordered_map容器用法详解
这里如果对map容器不熟悉,可以打断点看看怎么运行的


http://chatgpt.dhexx.cn/article/pPCdq0bw.shtml

相关文章

904. 水果成篮(c++)

滑动窗口&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int max_len 0;int left 0;unordered_map<int,int>mp;for(int right 0; right < fruits.size();right){mp[fruits[right]];while(mp.size() > 2){mp[fruits[lef…

904-线程池项目死锁问题分析

死锁问题 1、在ThreadPool的资源回收&#xff0c;等待线程池所有线程退出时&#xff0c;发生死锁问题&#xff0c;导致进程无法退出 我们的资源回收代码如下&#xff1a; //线程池析构 ThreadPool::~ThreadPool() {isPoolRunning_ false;notEmpty_.notify_all();//等待线程…

ORACLE 错误 904

错误原因&#xff1a; Oracle 版本中IMP和EXP的兼容问题。 我这里是因为本机上的oracle版本高于服务器上的oracle版本 解决办法&#xff1a; 安装和服务器同版本的10g客户端&#xff0c;在命令窗口化中切换到10g客户端的bin目录下面进行导入就ok了。 为什么要切换呢&#xf…

leetcode:904. 水果成篮

题目来源 leetcode&#xff1a;904. 水果成篮 题目描述 题目解析 题意 题意从任意位置开始&#xff0c;若最多只能收集两种水果&#xff0c;问最多能收集多少个水果。 这道题目可以理解为求只包含两种元素的最长连续子序列&#xff0c;和leetcode&#xff1a;159.最多有两个…

2022-7-8 Leetcode 904.水果成篮

错误的代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int start 0;int end 0;set<int> myset;int len 0;for (; end < fruits.size(); end){myset.insert(fruits[end]);if (myset.size() > 2 && start &l…

【LeetCode】图解 904. 水果成篮

904. 水果成篮 904. 水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

LeetCode_904 水果成篮

1、题目&#xff1a;水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c…

力扣第904题

一、题目&#xff1a;904. 水果成篮 二、题目解析&#xff1a; 题目解析&#xff1a;题目不太好理解&#xff0c;通俗解释一下&#xff0c;可以把数组中的每个元素理解成一个树&#xff0c;元素值理解成那种类型的果树&#xff0c;比如:[3,3,3,1,2,1,1,2,3,3,4] 我们可以认为1…

LeetCode 904. 水果成篮

904. 水果成篮 题目&#xff1a;你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

力扣(LeetCode)904. 水果成篮(C语言)

一、环境说明 本文是 LeetCode 904题 : 水果成篮&#xff0c;使用c语言实现滑动窗口哈希集合。测试环境:Visual Studio 2019 二、代码展示 //滑动窗口哈希表&#xff0c;一次遍历O(n) //难点&#xff1a;如何用判断边界的移动时机,应该可以自己实现。 //right和left不一定相…

(解决方案) Visual Studio 2019 连接 SQL Server 2019 数据库时,数据库版本为904无法打开,此服务器支持852版及更低版本的问题

我在做课设程序时连不上数据库&#xff0c;提示数据库版本太高。即使在数据库设置里把兼容性改到2016(852版)仍然无法连接&#xff0c;网上找的解决方法也不成功&#xff0c;自己摸索了一番找到了解决方法。具体是直接连接数据库的服务器&#xff0c;而不是连接数据库本身&…

【Linux】make的工作原理和makefile文件

● makefile文件 make是一个命令&#xff0c;makefile是一个文件。make命令执行时&#xff0c;需要一个 Makefile 文件&#xff0c;以告诉make命令需要怎么样的去编译和链接程序。一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;ma…

简单的makefile文件编写

习惯了windows下ide创建工程已经代码的编写&#xff0c;然后一键运行&#xff0c;很简单&#xff0c;因为很多事ide都帮我们做了&#xff0c;但是linux下不一样&#xff0c;需要手动编译&#xff0c;执行一条条的命令&#xff0c;一般工程都是由于很多文件组成的&#xff0c;比…

如何编写一个简单的Makefile文件

在c语言学习的初级阶段&#xff0c;我们所写的代码量较少&#xff0c;分装的文件也很少&#xff0c;直接使用gcc编译便能满足我们的大部分需求&#xff0c;然而随着我们学习的深入&#xff0c;代码量越来越多&#xff0c;已经开始做一些工程项目了&#xff0c;项目中包含多个c文…

Linux下编写makefile文件

首先在vi编辑器下编写add.c #include "test.h" #include <stdio.h> int add(int a, int b) { return a b; } int main() { printf(" 2 3 %d\n", add(2, 3)); printf(" 5 - 3 %d\n", sub(5, 3)); return 1; } 再编写sub.c…

如何创建 makefile文件

在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中如何创建makefile文件呢&#xff1f; 1&#xff0c;创建一个名为makefile的文件&#xff08;取消扩展名&#xff09; 输入下面命令示例内容 target1: md 11 target2: md 22 target3: rd 11 rd 22 2&am…

Makefile文件的简单编写

参考&#xff1a; MakeFile文件是什么——内容、工作原理、作用、使用 嵌入式操作系统linux篇&#xff08;书&#xff09; Makefile伪目标 GNU make中文手册.pdf 在嵌入式开发中&#xff0c;一个工程中的源文件是非常多的&#xff0c;如果一个个编译会很麻烦&#xff0c;Makefi…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

linux下制作makefile文件

1.最简单的一种当然也是最麻烦的一种(makefile 中的代码如下&#xff0c;其中hello.cpp是文件名&#xff0c;hello是编译后的命名。使用方法是直接输入 make) hello:hello.cpp …

编写 Makefile文件 (一)

参考&#xff1a;《linux程序设计&#xff08;第四版&#xff09;》 本文的编写从简单到复杂&#xff0c;一步一步完成Makefile文件的编写和完善。首先看一下我们的程序有哪些文件&#xff1a; 文件内的程序也很简单&#xff0c;就是输出该文件已经被调用&#xff0c;代码如下…