C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++で範囲合計クエリを実行した後、指定された配列から初期配列を検索します


この問題では、サイズNの配列res []が与えられます。私たちのタスクは、範囲合計クエリの後に、指定された配列から初期配列を検索することです。

[s、e、val]クエリを実行すると配列rel[]を返す開始配列を見つける必要があります。

各[s、e、val]クエリは次のように解決されます

s->開始インデックス

e->終了インデックス

val->配列内のsからeまでの各要素に追加される値を更新します。

問題を理解するために例を見てみましょう

Input : rel[] = {7, 4, 8}
Query[][] = {{1, 2, 1},
{0, 1, 3}}
Output : {4, 0, 7}

説明

initialArray = {4, 0, 7}; query = {1, 2, 1}; finalArray = {4, 1, 8}
initialArray = {4, 1, 8}; query = {0, 1, 3}; finalArray = {7, 4, 8}

ソリューションアプローチ

この問題の簡単な解決策は、すべてのクエリをトラバースすることです。すべてのクエリは、解決方法を使用して解決し、最後に見つかった配列を返します。ここで、initialArrayを見つけるには、逆の方法で操作する必要があります。つまり、指定された配列から減算します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
void calcInitialArrayQueries(int arr[], int n, int query[][3], int q) {
   for (int i = 0; i < q; i++) {
      for (int j = query[i][0];j <= query[i][1]; j++) {
         arr[j] = arr[j] - query[i][2];
      }
   }
   for (int i = 0; i < n; i++)
      cout<<arr[i]<<" ";
}
int main() {
   int arr[] = { 5, 1, 8, 2, 9};
   int n = sizeof(arr) / sizeof(arr[0]);
   int query[][3] = { {0, 2, -2}, {1, 4, 3}};
   int q = sizeof(query) / sizeof(query[0]);
   cout<<"Initial array : "; calcInitialArrayQueries(arr, n, query, q);
   return 0;
}

出力

Initial array : 7 0 7 -1 6

  1. 更新なしの範囲合計クエリ用のC++プログラム?

    インデックスiからインデックスjまでの要素の合計を計算する必要があります。 iとjのインデックス値で構成されるクエリは複数回実行されます。 Input:arr[] = {5, 6, 3, 4, 1 } i = 1, j =3 Output: 13 説明 6 + 3 + 4 = 13 sum[] = {5, 6+5, 3+6+5, 4+3+6+5, 1+4+3+6+5 } sum[]={5,11,14,18,19} sum[j]-sum[i-1]=sum[3]-sum[1-1]= sum[3]-sum[0]=18-5=13 このロジックは、iインデックスからjインデックスまでのループを開

  2. C#を使用してバックトラックすることにより、指定された配列からターゲットの合計を見つける方法は?

    ターゲット合計問題は、要素の合計が指定された数に等しくなるようなサブセットを見つける問題です。バックトラッキングアプローチは、最悪の場合にすべての順列を生成しますが、一般に、サブセット和問題に対する再帰的アプローチよりも優れたパフォーマンスを発揮します。 n個の正の整数と値の合計のサブセットAが与えられ、与えられたセットのサブセットが存在するかどうかを調べます。その要素の合計は、与えられた合計の値に等しくなります 配列[1,2,3]があるとすると、出力は「1,1,1,1」、「1,1,2」、「2,2」、「13」になります。出力「31」から、 ” 211”、” 121”は破棄できます 例 us