Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Range Sum Query - Immutable (คิวรี่ผลรวมช่วง - ไม่เปลี่ยนแปลง) ใน C++

คำอธิบายปัญหา

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็ม เราต้องหาผลรวมขององค์ประกอบที่อยู่ระหว่างดัชนี i ถึง j มี 2 สิ่งต้องระวัง: อาร์เรย์จะเป็น immutable (ไม่เปลี่ยนแปลง) ดังนั้นองค์ประกอบจะไม่ถูกแก้ไข และจะมีหลายคิวรี่แบบนี้ ดังนั้นเราต้องคำนึงถึงเวลาการทำงานสำหรับจำนวนคิวรี่มาก สมมติอาร์เรย์คือ A = [5, 8, 3, 6, 1, 2, 5] ถ้าคิวรี่คือ (A, 0, 3) ผลลัพธ์จะเป็น 5 + 8 + 3 + 6 = 22

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • สร้างอาร์เรย์ B โดย B[i] จะเก็บผลรวมขององค์ประกอบจาก 0 ถึง i
  • สำหรับคิวรี่ ให้คำนวณ B[j] – B[i – 1]

ตัวอย่างโค้ด

#include <bits/stdc++.h> using namespace std; class NumArray {    public:    vector <int> pre;    NumArray(vector<int>& nums) {       pre.clear();       int n = nums.size();       pre.resize(n);       for(int i = 0; i < n; i++){          if(i == 0)pre[0] = nums[0];          else          pre[i] = pre[i - 1] + nums[i];       }    }    int sumRange(int i, int j) {       if(i == 0)return pre[j];       return pre[j] - pre[i - 1];    } }; main(){    vector<int> v = {5,8,3,6,1,2,5};    NumArray na(v);    cout<<na.sumRange(0,2)<<endl;    cout<<na.sumRange(2,5)<<endl;    cout<<na.sumRange(0,5)<<endl; }

นำเข้า

Initialize it with [5,8,3,6,1,2,5] Call sumRange(0,2) sumRange(2,5) sumRange(0,5)

ผลลัพธ์

16 12 25