We are given an integer array, a set of segment start and end pointers and a key value and the problem statement here is to find all the values in the given range which are smal which are smal than are smal or equal to the given key value.
Input − arr[] = {7, 8 , 1, 4 , 6 , 8 , 10 }
Segment 1: start = 2, end = 4, k = 2
Segment 2: start = 1, end = 6, k = 3
#Output − Count of number which are smaller than or equal to key value in the given range are 2 6
Explanation − [8, 1, 4] represents the range from from 2 to 4 and 2 is the 2nd smallest number in the range [7, 8 , 1, 4 , 6 , 8 ]代表從1到6的範圍,6是範圍內第三小的數字
輸入 - arr[] = {2 , 7 , 9, 4 , 6 , 5 , 1 |
段落1:起始位置=3,結束位置=6,k=4
段落2:起始位置=2 ,結束位置=5,k=3
輸出 - 在給定範圍內小於或等於關鍵值的數字的數量為:9 7
解釋 - [9, 4 , 6 , 5]代表從3到6的範圍,9是給定範圍內第四小的數字 [7 , 9, 4 , 6 ] 表示從2到4的範圍,7是給定段範圍中第3小的數字
宣告一個整數型別的陣列。計算數組的大小。宣告一個向量類型的變量,形成整數類型的對。開始FOR循環,將資料從數組推送到向量中。
對給定的向量進行排序。建立一個整數類型的向量數組,大小為MAX。
呼叫函數generateTree(1, 0, size - 1, vec, tree),並將getSmallestIndex設定為queryWrapper(2, 5, 2, size, vec, tree)。
列印input[getSmallestIndex]。
將getSmallestIndex設定為呼叫函數queryWrapper(1, 6, 4, size, vec, tree)。
在函式generateTree(int treeIndex, int leftIndex, int rightIndex, vector
KSmall( mid, queryStart,queryEnd, 2 * treeIndex, key, tree)
Inside the function int queryWrapper(int queryStart, int queryEnd, int key, int n, vector
Example
#include <bits/stdc++.h> using namespace std; const int MAX = 1000; void generateTree(int treeIndex, int leftIndex, int rightIndex, vector<pair<int, int> > &a, vector<int> tree[]){ if (leftIndex == rightIndex){ tree[treeIndex].push_back(a[leftIndex].second); return; } int midValue = (leftIndex + rightIndex) / 2; generateTree(2 * treeIndex, leftIndex, midValue, a, tree); generateTree(2 * treeIndex + 1, midValue + 1, rightIndex, a, tree); merge(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), tree[2 * treeIndex + 1].begin(), tree[2 * treeIndex + 1].end(), back_inserter(tree[treeIndex])); } int calculateKSmallest(int startIndex, int endIndex, int queryStart, int queryEnd, int treeIndex, int key, vector<int> tree[]){ if (startIndex == endIndex){ return tree[treeIndex][0]; } int mid = (startIndex + endIndex) / 2; int last_in_query_range = (upper_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), queryEnd) - tree[2 * treeIndex].begin()); int first_in_query_range = (lower_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(),queryStart) - tree[2 * treeIndex].begin()); int M = last_in_query_range - first_in_query_range; if (M >= key){ return calculateKSmallest(startIndex, mid, queryStart, queryEnd, 2 * treeIndex, key, tree); } else { return calculateKSmallest(mid + 1, endIndex, queryStart,queryEnd, 2 * treeIndex + 1, key - M, tree); } } int queryWrapper(int queryStart, int queryEnd, int key, int n, vector<pair<int, int> > &a, vector<int> tree[]){ return calculateKSmallest(0, n - 1, queryStart - 1, queryEnd - 1, 1, key, tree); } int main(){ int input[] = { 7, 8 , 1, 4 , 6 , 8 , 10 }; int size = sizeof(input)/sizeof(input[0]); vector<pair<int, int> > vec; for (int i = 0; i < size; i++) { vec.push_back(make_pair(input[i], i)); } sort(vec.begin(), vec.end()); vector<int> tree[MAX]; generateTree(1, 0, size - 1, vec, tree); cout<<"Count of number which are smaller than or equal to key value in the given range are:"<<endl; int getSmallestIndex = queryWrapper(2, 4, 2, size, vec, tree); cout << input[getSmallestIndex] << endl; getSmallestIndex = queryWrapper(1, 6, 3, size, vec, tree); cout << input[getSmallestIndex] << endl; return 0; }
Count of number which are smaller than or equal to key value in the given range are: 4 6
以上是在C++中的合併排序樹的詳細內容。更多資訊請關注PHP中文網其他相關文章!