範圍查詢以查詢具有最大數字和的元素


簡介

在本教程中,我們討論了在 C++ 中進行範圍查詢以查詢具有最大數字和的元素的問題。為了解決這個問題,需要一個元素陣列和一些查詢。查詢表示陣列的索引,並使用這些查詢查詢具有最大數字和的陣列元素。最大數字和是兩個數字(個位和十位數字的加法)或一位數字的最高和。例如:12,其和為 3(1 + 2)。在本教程中,透過使用查詢找到具有最大數字和的數字。

為了實現這種方法,我們使用兩種方法

  • 樸素方法

  • 構建線段樹

演示 1

a[] = {1, 44, 16, 11, 18}
Query = [1, 4]

輸出

The maximum digit sum element is 18

解釋

在上面的示例中,使用查詢的子陣列為 {44, 16, 11, 18}。輸入陣列的起始索引為 0。為了找到最大數字和的元素,以以下方式新增兩位數字

44 = 4+4 = 8

16 = 1+6 = 7

11 = 1+1 = 2

18 = 1+8 = 9

最大和為 9,並且具有最大數字和的元素為 18。

演示 2

a[] = {12, 44, 55, 45, 63}
Query = [2, 4]

輸出

The maximum digit sum element is 55

解釋

在上面的示例中,使用查詢 [2, 4] 的子陣列為 {55, 45, 63}。為了找到最大數字和的元素,像這樣找到每個元素的和

55 = 5+5 = 10

45 = 4+5 = 9

63 = 6+3 = 9

最大和為 10,並且具有此最大和的元素為 55。

C++ 庫函式

語法

size(): 它是 C++ 標準庫的內建函式。它返回輸入字串的長度。

string_name.size(); 

pow(): 它在 <cmath> 標頭檔案中定義。它接受兩個引數,並返回第一個引數的第二個引數次冪。

pow(a, b);

vector: 它是一個動態陣列,在 C++ 的 vector 標頭檔案中定義。可以輕鬆地插入和刪除其元素。

vector<data_type> vector_name;

ceil(): 它在 <cmath> 標頭檔案中定義。它接受一個引數,並返回引數的最近大於或等於的值。

ceil(n);

sizeof(): 它在 C++ 標準庫中定義。它在編譯時計算變數、常量和資料型別的 size。

sizeof(variable);

演算法 1

  • 初始化一個元素陣列 a[]。

  • 定義查詢以查詢元素的索引。

  • 使用 for 迴圈遍歷查詢中定義的陣列索引。

  • 透過將數字加在一起計算每個元素的和。

  • 列印具有最大數字和的數字。

示例 1

我們使用簡單的方法實現任務。在這種方法中,我們使用 for 迴圈遍歷陣列,查詢中定義了起始和結束範圍。計算元素的和,並列印具有最大數字和的元素。

#include <iostream>
using namespace std;
 
// Function for calculating the digit sum 
int digitSum(int no){
    int result = 0;
    while (no > 0){
        result += no % 10;
        no /= 10;
    }
    return result;
}
 
// Function for finding the maximum sum digit number
int maximumDigitSum(int a[], int s, int i, int j){
    int maxs = -1, maxn = -1;
    for (int x = i; x <= j; x++){
        int result = digitSum(a[x]);
        if (result > maxs){
            maxs = result;
            maxn = a[x];
        }
        else if (result == maxs && a[x] > maxn){
            maxn = a[x];
        }
    }
    return maxn;
}
 
// code controller
int main(){
    // Input array
    int a[] = { 11, 14, 34, 51, 32 };
 
    int s = sizeof(a) / sizeof(a[0]);
    int i = 1, j = 4;
    cout << "The maximum digit sum number is : "<<maximumDigitSum(a, s, i, j) << endl;

    return 0;
}

輸出

The maximum digit sum number is : 34

演算法 2

  • 初始化一個元素陣列。

  • 指定查詢範圍。

  • 構建一個線段樹,其中每個節點表示一個元素陣列。

    • 線段樹的構建首先將其分成兩半,每個節點表示兩個值。

    • 將值插入左孩子和右孩子。

  • 線段樹中的每個節點都有兩個值:數字和 maxDigitSum。

  • 使用查詢中定義的範圍,透過遍歷線段樹來查詢最大數字和。

  • 列印結果。

示例 2

在這裡,我們透過構建線段樹在 C++ 中實現該問題。構建線段樹並使用查詢查詢最大數字和。遞迴呼叫使用者定義的函式 maximumDigitSum 來迭代線段樹並計算輸出。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

// Function to calculate the digit sum of a number
int digitSumNumber(int no){
    int result = 0;
    while (no > 0){
        result += no % 10;
        no /= 10;
    }
    return result;
}

// Function to build the segment tree
void buildSegmentTree(vector<int>& segtree, const vector<int>& a, int l, int h, int p){
    if (l == h){
        segtree[p] = a[l];
        return;
    }
    int m = (l + h) / 2;
    buildSegmentTree(segtree, a, l, m, 2 * p + 1);
    buildSegmentTree(segtree, a, m + 1, h, 2 * p + 2);
    segtree[p] = max(segtree[2 * p + 1], segtree[2 * p + 2]);
}

// Function to query the segment tree for maximum digit sum in a given range
int querySegTree(vector<int>& segtree, int i, int j, int l, int h, int p){
    if (i <= l && j >= h)
        return segtree[p];
    if (i > h || j < l)
        return 0;
    int m = (l + h) / 2;
    return max(querySegTree(segtree, i, j, l, m, 2 * p + 1),
               querySegTree(segtree, i, j, m + 1, h, 2 * p + 2));
}

// Function to initialize the segment tree
int maxDigitSum(const vector<int>& a, int s, int i, int j){
    int segTreeHeight = ceil(log2(s));
    int segTreeSize = 2 * pow(2, segTreeHeight) - 1;
    vector<int> segtree(segTreeSize);

    buildSegmentTree(segtree, a, 0, s - 1, 0);

    return querySegTree(segtree, i, j, 0, s - 1, 0);
}

int main(){
    vector<int> a = {12, 13, 45, 17, 10, 23};
    int s = a.size();
    int i = 1, j = 4;

    int number = maxDigitSum(a, s, i, j);

    cout << "Maximum digit sum in the range [" << i << ", " << j << "]: " << number << endl;

    return 0;
}

輸出

Maximum digit sum in the range [1, 4]: 45

結論

我們已經完成了本教程關於在查詢範圍內查詢數字最大和的學習。我們使用了兩種方法來解決本教程的任務:樸素方法和線段樹。用一些示例演示了問題陳述,以便理解其目的。在 C++ 實現過程中,我們初始化一個數組並定義查詢範圍以查詢最大數字和的數字。

更新於: 2023年8月18日

214 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告