这是一个数组左旋转的代码....如何进一步优化它,因为它给出了TLE错误

时间:2016-08-11 11:45:22

标签: c++

#include <iostream>


using namespace std;


int main() {

    int n,d,i=0,temp;
    cin>>n>>d;          
    int a[1000000];           
    for(i=0;i<n;i++){         
        cin>>a[i];
          } 

  while(d--){             

        temp=a[0];

        for(i=1;i<n;i++){
            a[i-1]=a[i];}
        a[n-1]=temp;
        } 

      for(i=0;i<n;i++){

        cout<<a[i]<<" ";

    }
    return 0;
}

如何进一步优化它,因为它会产生TLE错误。输入文件显然非常大。

1 个答案:

答案 0 :(得分:2)

一些建议:

  1. 在一个循环中按全额d旋转(请注意,结果是不同的数组b):

    for (i = 0; i < n; i++) {
        b[(i+n-d) % n]=a[i];
    }
    
  2. 根本不要触摸数组,而是在访问时转换索引,例如:

    cout << a[(i+n-d) % n] << " ";
    
  3. 第二个版本需要在访问数组元素时进行额外的计算,但如果在每次旋转操作后不需要访问所有数组元素,它应该更快。

    1. 还有一种方法可以通过使用反转数组范围的辅助函数来就地进行旋转。这有点奇怪,但可能是最好的解决方案。为方便起见,我在这里使用了std::vector而不是数组:

      void ReverseVector( std::vector<int>& a, int from, int to ) {
          for (auto i = 0; i < (to - from) / 2; i++) {
              auto tmp = a[from + i];
              a[from + i] = a[to - i];
              a[to-i] = tmp;
          } 
      }
      
      void RotateVector( std::vector<int>& a, int distance ) {
          distance = (distance + a.size()) % a.size();
          ReverseVector( a, 0, a.size() - 1 );
          ReverseVector( a, 0, distance - 1 );
          ReverseVector( a, distance, a.size() - 1 );
      }