【问题标题】:C++ deque STL - Maximum of contiguous subarrayC++ deque STL - 连续子数组的最大值
【发布时间】: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


【解决方案1】:
#include <iostream>
#include <deque> 
using namespace std;

void printKMax(int arr[], int n, int k)
{
    //Write your code here.
    /* Deque-STL in C++ - Hacker Rank Solution START */
    deque<int> Qi(k);
    int i;
    for (i = 0; i < k; i++) 
    {
        while ((!Qi.empty()) && (arr[i] >= arr[Qi.back()]))
            Qi.pop_back();
        Qi.push_back(i);
    }
    for ( ; i < n; i++) {
        cout << arr[Qi.front()] << " ";
        while ((!Qi.empty()) && (Qi.front() <= i - k))
            Qi.pop_front();
        while ((!Qi.empty()) && (arr[i] >= arr[Qi.back()]))
            Qi.pop_back();
        Qi.push_back(i);
    }
    cout << arr[Qi.front()] << endl;
    /* Deque-STL in C++ - Hacker Rank Solution END */
}

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 2020-01-22
    • 2013-09-13
    • 2022-12-20
    • 2021-01-15
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多