📌  相关文章
📜  Java程序查找范围求和查询,以按 K 索引对 Array 进行逆时针旋转

📅  最后修改于: 2022-05-13 01:55:52.265000             🧑  作者: Mango

Java程序查找范围求和查询,以按 K 索引对 Array 进行逆时针旋转

给定一个包含N个元素的数组arr和以下两种类型的Q个查询:

  • 1 K :对于这种类型的查询,数组需要从当前状态逆时针旋转K个索引。
  • 2 LR :对于此查询,需要计算索引[L, R]中存在的数组元素的总和。

例子:

方法:

  • 创建一个大小为arr两倍的前缀数组,并将arr的第i索引处的元素复制到[0, N)中所有 i 的第i和第N + i前缀索引。
  • 为该数组的每个索引预先计算前缀和并存储在前缀中。
  • 将指针设置为从0开始以表示初始数组的起始索引。
  • 对于类型 1 的查询,将start移至
((start + K) % N)th position
  • 对于类型 2 的查询,计算
prefix[start + R]
 - prefix[start + L- 1 ]
  • 如果start + L >= 1或打印的值
prefix[start + R]
  • 除此以外。

下面的代码是上述方法的实现:

Java
// Java program to calculate range sum
// queries for anticlockwise
// rotations of array by K
class GFG{
  
// Function to execute the queries
static void rotatedSumQuery(int arr[], int n,
                            int [][]query, int Q)
{
      
    // Construct a new array
    // of size 2*N to store
    // prefix sum of every index
    int []prefix = new int[2 * n];
  
    // Copy elements to the new array
    for(int i = 0; i < n; i++)
    {
        prefix[i] = arr[i];
        prefix[i + n] = arr[i];
    }
  
    // Calculate the prefix sum
    // for every index
    for(int i = 1; i < 2 * n; i++)
        prefix[i] += prefix[i - 1];
  
    // Set start pointer as 0
    int start = 0;
  
    for(int q = 0; q < Q; q++)
    {
  
        // Query to perform
        // anticlockwise rotation
        if (query[q][0] == 1)
        {
            int k = query[q][1];
            start = (start + k) % n;
        }
  
        // Query to answer range sum
        else if (query[q][0] == 2) 
        {
            int L, R;
            L = query[q][1];
            R = query[q][2];
  
            // If pointing to 1st index
            if (start + L == 0)
  
                // Display the sum upto start + R
                System.out.print(prefix[start + R] + "
");
  
            else
  
                // Subtract sum upto start + L - 1
                // from sum upto start + R
                System.out.print(prefix[start + R] -
                                 prefix[start + L - 1] + 
                                 "
");
        }
    }
}
  
// Driver code
public static void main(String[] args)
{
    int arr[] = { 1, 2, 3, 4, 5, 6 };
  
    // Number of query
    int Q = 5;
  
    // Store all the queries
    int [][]query = { { 2, 1, 3 },
                      { 1, 3 },
                      { 2, 0, 3 },
                      { 1, 4 },
                      { 2, 3, 5 } };
  
    int n = arr.length;
    rotatedSumQuery(arr, n, query, Q);
}
}
  
// This code is contributed by Rohit_ranjan


输出:
9
16
12

时间复杂度:每个查询O(1)
辅助空间复杂度: O(N)

有关更多详细信息,请参阅关于数组逆时针旋转 K 索引的范围和查询的完整文章!