在这个问题中,我们给了一个以0初始化的N个元素组成的数组arr []。我们的任务是创建一个程序,以在C ++中执行m个范围增量操作后在数组中找到最大值。
在数组上,我们将执行该类型的m个范围增量操作,
update [L,R,K] =将值K添加到范围内的所有元素。
在数组上执行m次操作后。我们需要在数组中找到具有最大值的元素。
让我们举个例子来了解这个问题,
N = 6, m = 4 Update[][] = {{1, 4, 12}, {0, 3, 5}, {1, 5, 7}, {3, 5, 10}}
输出结果
34
arr[] = {0, 0, 0, 0, 0, 0} Update 1 {1, 4, 12} : arr[] = {0, 12, 12, 12, 12, 0} Update 2 {0, 3, 5} : arr[] = {5, 17, 17, 17, 12, 0} Update 3 {1, 5, 7} : arr[] = {5, 24, 24, 24, 19, 7} Update 4 {3, 5, 10} : arr[] = {5, 24, 24, 34, 29, 17}
解决该问题的一种简单方法是简单地更新数组的值,然后在完成所有操作之后。查找数组的最大元素。
该程序说明了我们解决方案的工作原理,
#include<iostream> using namespace std; int findmax(int arr[], int N){ int maxVal = 0; for(int i = 0; i < N; i++){ if(maxVal < arr[i]){ maxVal = arr[i]; } } return maxVal; } void updateVal(int arr[], int L, int R, int K){ for(int i = L; i <= R; i++ ){ arr[i] += K; } } int main(){ int N = 5; int arr[N] = {0}; int M = 4; int rangeIncOperation[M][3] = {{1, 4, 12}, {0, 3, 5}, {1, 5, 7}, {3, 5, 10}}; for(int i = 0; i < M; i++){ updateVal(arr, rangeIncOperation[i][0], rangeIncOperation[i][1], rangeIncOperation[i][2]); } cout<<"The maximum value in the array after "<<M<<" range increment operations is "<<findmax(arr, N); return 0; }
输出结果
The maximum value in the array after 4 range increment operations is 34
此操作很好,但是会在每个查询的范围内进行迭代,从而使顺序复杂度为O(m * N)。
更好的方法是为每个范围增量操作将K加到L并从R + 1中减去K。然后找到最大最大值,即为数组中的每个值更新和值,并找到操作中出现的最大值。
该程序说明了我们解决方案的工作原理,
#include<iostream> using namespace std; int FindMaximum(int a, int b){ if(a > b) return a; return b; } int findmax(int arr[], int N){ int maxVal = 0; int sum = 0; for(int i = 0; i < N; i++){ sum += arr[i]; maxVal = FindMaximum(maxVal, sum); } return maxVal; } void updateVal(int arr[], int L, int R, int K){ arr[L] += K; arr[R+1] -= K; } int main(){ int N = 5; int arr[N] = {0}; int M = 4; int rangeIncOperation[M][3] = {{1, 4, 12}, {0, 3, 5}, {1, 5, 7}, {3, 5, 10}}; for(int i = 0; i < M; i++){ updateVal(arr, rangeIncOperation[i][0], rangeIncOperation[i][1], rangeIncOperation[i][2]); } cout<<"The maximum value in the array after "<<M<<" range increment operations is "<<findmax(arr, N); return 0; }
输出结果
The maximum value in the array after 4 range increment operations is 34