【发布时间】:2023-01-15 04:36:38
【问题描述】:
这是一个黑客问题给定一组大小为 size 的数组和一个整数,您必须为每个给定数组的每个连续的大小为 size 的子数组找到最大整数。
输入格式
输入的第一行将包含测试用例 T 的数量。对于每个测试用例,您将获得数组 N 的大小和要使用的子数组的大小 K。接下来是数组 Ai 的元素。
输出格式
对于每个数组大小的每个连续子数组,您必须打印最大整数。
样本输入
2个
5 2
3 4 6 3 4
7 4
3 4 5 8 1 4 10
示例输出
4 6 6 4
8 8 8 10
解释
对于第一种情况,大小为 2 的连续子数组是 {3,4}、{4,6}、{6,3} 和 {3,4}。大小为 2 的子数组的 4 个最大元素是:4 6 6 4。
对于第二种情况,大小为 4 的连续子数组是 {3,4,5,8}、{4,5,8,1}、{5,8,1,4} 和 {8,1,4,10 }.大小为 4 的子数组的 4 个最大元素是:8 8 8 10。
蛮力方法效果很好。 但它需要优化代码。我读了很多方法来实现。 geeksforgeeks 上给出的算法适用于测试用例,但我无法理解其中的逻辑。我理解并实现的一种算法如下。但是,这不适用于真实的测试用例。尽管在自定义输入和样本输入上给出了正确的结果。任何人都可以纠正我或解释这个问题的任何其他算法吗?请帮忙。
#include <iostream>
#include <deque>
using namespace std;
void printKMax(int arr[], int n, int k){
deque<int> dq;
//For each subarray
//Index of max element stored at the end of deque
for(int i=0; i<n-k+1; i++){
//This will run only once
if(dq.empty()){
dq.push_back(0);
for(int j=1; j<=k-1; j++){
if(arr[j] > arr[i]){
dq.push_back(j);
}else{
dq.push_front(j);
}
}
cout<<arr[dq.back()]<<" ";
}
else{
//Check if max index is still under current window
if(dq.back() < i){
dq.pop_back();
int maxIndex=i+k-1;
for(int j=0; j<dq.size(); j++){
if(arr[dq[j]] > arr[maxIndex]){
int temp= maxIndex;
maxIndex = dq[j];
dq[j] = temp;
}
}
dq.push_back(maxIndex);
cout<<arr[dq.back()]<<" ";
}
else{
//Check if new index is larger than the max of current window
dq.pop_front();
if(arr[dq.back()] > arr[i+k-1])
dq.push_front(i+k-1);
else {
dq.push_back(i+k-1);
}
cout<<arr[dq.back()]<<" ";
}
}
}
cout<<"\n";
}
int main(){
int t;
cin >> t;
while(t>0) {
int n,k;
cin >> n >> k;
int i;
int arr[n];
for(i=0;i<n;i++)
cin >> arr[i];
printKMax(arr, n, k);
t--;
}
return 0;
}
【问题讨论】:
-
您的代码无效,C++ doesn't have variable-length arrays。请不要使用所谓的“竞争”或“评判”网站来学习坏习惯、坏习惯,在这种情况下甚至是无效代码。此类网站不是教学或学习资源,不应如此使用。
-
int arr[n];不是标准的 C++。避免std::vector但使用其他标准容器很奇怪。 -
什么是“真实测试用例”?什么是输入、输出和预期输出?
-
Coding Puzzles 的问题在于你学习的是拼图而不是编码。这根本不是专业开发人员获得任务的方式。所以如果你想成为一名开发人员,你正在学习错误的东西......
-
我认为在这里花费大量时间试图让 OP 觉得他们做错了什么只是为了解决 HackerRank 上的问题是完全不合适的。不管您喜不喜欢,有许多开发人员发现使用此类网站可以帮助他们找到工作。此外,他们这样做可能是为了好玩,这也是有道理的。
标签: c++ arrays stl deque sub-array