问题描述
小M终于拥有了属于自己的房子,并打算好好设计书房。他有很多珍藏的书籍,这些书按照时间顺序保存着。现在,他希望在书柜的每个格子里,书籍的高度差异不超过一个特定值 k,并且书籍的排列要满足时间上的连续性(即书籍在格子内的序号要连续)。同时,书柜的每个格子能容纳的书越多越好。
你的任务是帮助小M计算出在同一个格子里最多能放多少本书,以及有多少种放置方式可以达到这个要求,并且列出每种放置方式中书籍的最小和最大序号。
返回的列表中,第一行的第一个元素是最大的书的数量,第二个元素是放置方式数量m,此后m个列表分别表示书籍的最小和最大序号。
测试样例
样例1:
输入:
n = 3, k = 3, array = [14, 12, 10]
输出:[[2, 2], [1, 2], [2, 3]]
样例2:
输入:
n = 2, k = 0, array = [10, 10]
输出:[[2, 1], [1, 2]]
样例3:
输入:
n = 4, k = 5, array = [8, 19, 10, 13]
输出:[[2, 1], [3, 4]]
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> solution(int n, int k, vector<int> array) {
int max_len = 0;
vector<vector<int>> result;
for (int l = n; l >= 1; --l) {
bool found = false;
vector<vector<int>> temp;
for (int i = 0; i <= n - l; ++i) {
int j = i + l - 1;
int current_max = *max_element(array.begin() + i, array.begin() + j + 1);
int current_min = *min_element(array.begin() + i, array.begin() + j + 1);
if (current_max - current_min <= k) {
temp.push_back({i + 1, j + 1});
found = true;
}
}
if (found) {
max_len = l;
result = temp;
break;
}
}
vector<vector<int>> output;
output.push_back({max_len, static_cast<int>(result.size())});
output.insert(output.end(), result.begin(), result.end());
return output;
}
int main() {
// Add your test cases here
cout << (solution(3, 3, {14, 12, 10}) ==
vector<vector<int>>{{2, 2}, {1, 2}, {2, 3}})
<< endl;
cout << (solution(2, 0, {10, 10}) == vector<vector<int>>{{2, 1}, {1, 2}})
<< endl;
cout << (solution(4, 5, {8, 19, 10, 13}) ==
vector<vector<int>>{{2, 1}, {3, 4}})
<< endl;
return 0;
}