C++ 中检查给定范围内是否存在给定数字的查询
在这个问题中,我们给定了一个数组 arr[] 和一些查询,每个查询包含三个值 L、R 和 val。我们的任务是创建一个程序来解决 C++ 中检查给定范围内是否存在给定数字的查询。
问题描述 -
为了解决每个查询,我们需要检查给定元素 val 是否存在于 L 和 R 之间的给定范围内。
让我们举一个例子来理解这个问题,
**输入**:arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1}
Q = 3
query = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }}
**输出**:不存在
存在
存在
解释
查询 1:范围是 [1, 4],子数组 = {8, 1, 7, 2}。3 不存在于此子数组中。
查询 2:范围是 [0, 2],子数组 = {4, 8, 1}。1 存在于此子数组中。
查询 1:范围是 [4, 7],子数组 = {2, 9, 3, 5, 1}。2 存在于此子数组中。
解决方案方法
解决此问题的一个简单方法是遍历子数组并检查给定元素是否存在于范围内。
示例
#include <iostream>
using namespace std;
bool isElementPresent(int arr[], int L, int R, int val){
for(int i = L; i <= R; i++ ){
if(arr[i] == val){
return true;
}
}
return false;
}
int main(){
int arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1};
int Q = 3;
int query[Q][3] = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }};
for(int i = 0; i < Q; i++){
cout<<"For Query "<<(i+1);
if(isElementPresent(arr, query[i][0], query[i][1], query[i][2]))
cout<<": The given digit "<<query[i][2]<<" is present in the given range\n";
else
cout<<": The given digit "<<query[i][2]<<" is not present in the given range\n";
}
return 0;
}输出
For Query 1: The given digit 3 is not present in the given range For Query 2: The given digit 1 is present in the given range For Query 3: The given digit 2 is present in the given range
这种方法使用循环,因此时间复杂度为 O(Q * N) 级别。其中 Q 是查询数。
一个**更好的解决方案方法**可能是使用线段树来存储所有可能的数字 (0 - 9)。为了避免节点中的重复元素,我们将使用 set 数据结构(它具有消除重复元素的属性)。这将有助于我们将每个节点中的元素总数减少到最多 10 个。
然后,对于查询,我们将检查元素是否存在于给定范围内。
示例
#include <bits/stdc++.h>
using namespace std;
set<int> SegTree[36];
void buildSegmentTree(int* arr, int index, int start, int end) {
if (start == end) {
SegTree[index].insert(arr[start]);
return;
}
int middleEle = (start + end) >> 1;
buildSegmentTree(arr, 2 * index, start, middleEle);
buildSegmentTree(arr, 2 * index + 1, middleEle + 1, end);
for (auto it : SegTree[2 * index])
SegTree[index].insert(it);
for (auto it : SegTree[2 * index + 1])
SegTree[index].insert(it);
}
bool isElementPresent(int index, int start, int end, int L, int R, int val){
if (L <= start && end <= R) {
if (SegTree[index].count(val) != 0) {
return true;
}
else
return false;
}
if (R < start || end < L) {
return false;
}
int middleEle = (start + end) >> 1;
bool isPresentInLeftSubArray = isElementPresent((2 * index), start,middleEle, L, R, val);
bool isPresentInRightSubArray = isElementPresent((2 * index + 1),(middleEle + 1), end, L, R, val);
return isPresentInLeftSubArray or isPresentInRightSubArray;
}
int main(){
int arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1};
int n = sizeof(arr)/sizeof(arr[0]);
int Q = 3;
int query[Q][3] = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }};
buildSegmentTree(arr, 1, 0, (n - 1));
for(int i = 0; i < Q; i++){
cout<<"For Query "<<(i+1);
if(isElementPresent(1, 0, (n - 1), query[i][0], query[i][1], query[i][2]))
cout<<": The given digit "<<query[i][2]<<" is present in the given
range\n";
else
cout<<": The given digit "<<query[i][2]<<" is not present in the given range\n";
}
return 0;
}输出
For Query 1: The given digit 3 is not present in the given range For Query 2: The given digit 1 is present in the given range For Query 3: The given digit 2 is present in the given range
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP