Hackerrank超时限制

时间:2016-11-07 18:15:05

标签: c++ arrays performance optimization

我在Hackerrank上成功解决了一个问题,并且它通过了所有测试用例,但是我收到错误超时限制。我猜测我是否优化了我的代码它会起作用,但我无法想办法让我的代码更有效率。

问题是:   在大小为n的阵列上的左旋转操作将每个阵列元件1单元向左移位。例如,如果在数组[1,2,3,4,5]上执行了2次左旋转,则数组将变为[3,4,5,1,2]。

给定n个整数和数字d的数组,在数组上执行左旋转。然后将更新的数组打印为一行以空格分隔的整数。

任何人都可以指导我如何提高这段代码的效率吗?

我的代码是:

vector<int> array_left_rotation(vector<int> a, int n, int k) {
    for (int j = 0; j < k; j++){
        a[n] = a[0];
        for (int i = 0; i < n; i++){
            a[i] = a[i+1];
        }
        a[n-1] = a[n];
    }
    return a;
}

n是数组中元素的数量 k是要执行的旋转次数

4 个答案:

答案 0 :(得分:2)

您不需要为此问题实际旋转阵列。公式(i + k) % n将为数组提供索引i的元素,该数组已向左旋转k次。知道了这一点,一旦以这种方式访问​​每个元素,就可以通过数组:

int main() {
  int* arr, n, k, i;
  cin >> n >> k;
  arr = new int[n];
  for (i = 0; i < n; ++i)
    cin >> arr[i];
  for (i = 0; i < n; ++i)
    cout << arr[(i + k) % n] << " ";
}

答案 1 :(得分:0)

尝试执行k旋转,而不是执行k旋转: 一次旋转k左边的整个数组。这样效率更高。

答案 2 :(得分:0)

如果另一个向量不会导致空间问题,您可以使用偏移量复制它们:

//Not tested
vector<int> array_left_rotation(vector<int> a, int n, int k) {
    std::vector<int> result(n);
    for (int j = 0; j < k; j++){
       result[j]=a[(j+k)%n];
    }
    return result;
}

答案 3 :(得分:0)

using namespace std;
#include<iostream>
int main()
{
    int a[1000000],b[1000000];
    int n,d;
    cin>>n;
    cin>>d;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=0,j;i<n;i++)
    {
        if(i==0)
        {
            j=n-d;
            b[j]=a[i];
        }
        else if(i==d)
        {
            j=i-d;
            b[j]=a[i];
        }
        else 
        { 
            j=(n-d+i);
            if(j>n)
            {
                j=(i-d);
                b[j]=a[i];
            }
            else
            {
                j=(n-d+i);
                b[j]=a[i];
            }
        } 
    }
    for(int i=0;i<n;i++)
    {
        cout<<b[i]<<" ";
    }
}

这传递了所有测试用例。我实际做的是将数组a[i]中的每个元素移动到另一个数组b[i]中k次,因为没有空间约束。