[Leetcode] 904. 水果成篮 —— 滑动窗口

news/2024/5/20 7:57:21 标签: leetcode, 算法, 滑动窗口

Problem: 904. 水果成篮

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

需要找到连续的最多两种类型的最长序列

通过例子讲解思路:34335,left=0,mid=1,new_mid=2

定义:现有三个下标left,mid,new_mid;其中left和mid分别指为两种特定的类型;new_mid是当前数据与现有两种类型都不匹配时,left应该移动到哪里


最开始有两种类型分别为3,4(对应下标left=0,mid=1),之后当新的类型5出现时,与现有两种类型不同,因此需要对类型进行调整,即移动left以及mid(left移动到new_mid(=2)位置上,mid移动到类型5所在的位置(mid=4)上)

解题方法

由于有两种类型,需要逐步完善这两种类型:

  1. 只有一个类型时,当前位置和保存的一个类型不同,则扩充第二个类型
  2. 当前位置和保存的两个类型不同,重新调整类型(即移动left以及mid)

易错点:第2.中(与现有类型都不匹配情况)需要全面考虑,考虑的内容已经放到代码注释当中

复杂度

时间复杂度:

添加时间复杂度, 示例: O ( n ) O(n) O(n)

空间复杂度:

添加空间复杂度, 示例: O ( 1 ) O(1) O(1)

Code

class Solution {
public:
int totalFruit(vector<int>& fruits) {
	int left = 0, right = 0;
	int type = 1, mid = left, max_result = 1, new_mid=left;  // !!! left和mid分别为两种特定的类型, new_mid是当类型都不匹配时,left应该移动到哪里
	for (; right < fruits.size(); right++){
		if ((fruits[right] != fruits[mid] || fruits[right] != fruits[left]) && type == 1){  // 当前位置和保存的一个类型不同,扩充第二个类型
			type--;
			mid = right;  // 保存第二个不同值位置
			new_mid = mid;
		}
		else if(fruits[right] != fruits[mid] && fruits[right] != fruits[left] && type == 0){ // 当前位置和保存的两个类型不同,重新调整类型
			left = new_mid;
			mid = right;
		}
		
		if(fruits[right] == fruits[mid] || fruits[right] == fruits[left]){
			max_result = max(max_result, right-left+1);
			// 确定当类型都不匹配时,从已经匹配的位置上找left移动的位置new_mid
			if(fruits[right] == fruits[left] && fruits[right] != fruits[new_mid]){  // 出现12111情况,left:0, mid:1, new_mid:2
				new_mid = right;
			}else if(fruits[right] == fruits[mid] && fruits[right] != fruits[new_mid]){  // 出现121222情况,left:0, mid:1, new_mid:3
				new_mid = right;
			}
		}
//		cout<<left<<"   "<<right<<"   mid:"<<mid<<"  new:"<<new_mid<<"   type:"<<type<<" | "<<max_result<<endl;
	}
		
	return max_result;
}
};

http://www.niftyadmin.cn/n/5423823.html

相关文章

软考73-上午题-【面向对象技术2-UML】-UML中的图4

一、构件图&#xff08;组件图&#xff09; 1-1、构件图的定义 展现了&#xff0c;一组构件之间的组织和依赖。 构件图专注于系统的静态实现图。 构件图与类图相关&#xff0c;通常把构件映射为一个、多个类、接口、协作。 【回顾】&#xff1a; 类图展示了一组对象、接口、…

JavaSec 基础之 CC1 链

文章目录 背景环境以及配置分析0x1 终点(利用点分析)0x20x30x310x320x33 0x040x05 背景 Apache Commons Collections是Apache提供的一个Java库&#xff0c;它扩展了Java自带的集合框架。通过这个库&#xff0c;咱们可以使用更多种类的集合类型&#xff0c;以及各种实用的集合操…

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用&#xff08;不推荐&#xff09; 先下载到本地&#xff0c;以.rpm文件名结尾&#xff0c;下载完成后&#xff0c;再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …

.net core框架

ASP.NET Core 入门 跨平台开源框架 B/S 类与方法 Console 部分称为“类”。 类“拥有”方法&#xff1b;或者可以说方法存在于类中。 WriteLine() 部分称为“方法”。 想要使用方法就要知道方法在哪里 —————————— 执行流 一次执行一段 ASP.NET Core 是什么东西…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

Effective C++ 学习笔记 条款26 尽可能延后变量定义式的出现时间

只要你定义了一个变量而其类型带有一个构造函数或析构函数&#xff0c;那么当程序的控制流&#xff08;control flow&#xff09;到达这个变量定义式时&#xff0c;你便得承受构造成本&#xff1b;当这个变量离开其作用域时&#xff0c;你便得承受析构成本。即使这个变量最终并…

Bitmap实现原理应用场景

Bitmap是什么&#xff1f; 用内存中连续的二进制位&#xff08;bit&#xff09;&#xff0c;用0或1标识数据是否存在。 长度为10的bitmap&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 在bitmap中存在。 Bitmap实现 1、字符串 数值对应字符串的下标、二进制位0&…

全景解析 Partisia Blockchain:以用户为中心的全新数字经济网络

在区块链世界中&#xff0c;以比特币、以太坊网络为代表的主流区块链奠定了该领域早期的基础&#xff0c;并让去中心化、点对点、公开透明以及不可逆成为了该领域固有的意识形态。事实上&#xff0c;过于透明正在成为区块链规模性采用的一大障碍&#xff0c;我们看到 90% 以上的…