《程序员代码面试指南》it名企算法与数据结构题目最优解(第二版)刷题笔记6

由于之前看了牛客网的数据结构和算法的课程知道了左神,现在找到了这本书当作入门书做做吧,虽然书的题解都是java实现的,但好在用c++实现难度不大。

第一章 栈和队列

题目一:最大值减去最小值小于或等于num的子数组数量

//! @file    findTheNumberOfMaxreduceMinLOETnum.cpp
//! @author  鶸.
//! @date    2019/4/3
//! @brief   1、如果子数组arr[i…j]满足条件,那么arr[i…j]中的子数组一定也满足条件。
//         2、如果子数组arr[i…j]不满足条件,那么包含arr[i…j]的子数组一定也不满足条件。
//           3、用双端队列来维护max和min的更新,详细可以看我之前的"生成窗口最大值数组"问题
#include "stdafx.h"
#include <deque>
#include <iostream>
#include <vector>
using namespace std;
int getTheNumber(vector<int> arr,int num){
	deque<int> max,min;int number=0,i=0,j=0;//由题意得,i和j在两个for循环之前定义便于计算number
	for (;i<arr.size();++i)
	{
		for (;j<arr.size();++j)
		{
			while(!max.empty()&&arr[max.back()]<=arr[j])
				max.pop_back();
			max.push_back(j);
			while(!min.empty()&&arr[min.back()]>=arr[j])
				min.pop_back();
			min.push_back(j);
			if ((max.front()-min.front())>num)
			{
				break;
			}
		}
		//如果j=i则不是数组了
		number+=j-i;
		//双端队列的好处
		if (max.front()==i)
		{
			max.pop_front();
		}
		if (min.front()==i)
		{
			min.pop_front();
		}
	}
	return number;
}
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> a;
	a.push_back(3);
	a.push_back(2);
	a.push_back(5);
	a.push_back(1);
	a.push_back(4);
	a.push_back(7);
	a.push_back(8);
	a.push_back(6);
	cout<<getTheNumber(a,4);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_43241311/article/details/88995673