当有多个查询时,检查某些子数组是否排序的有效方法是什么?
What is the efficient way to check if some sub-array's are sorted or not when there are several queries?
假设数组A = {5, 4, 3, 7, 9, 11, 2}
.查询数量K
。在每个查询中,我将得到两个整数L
和R
其中0 <= L <= R < N
(其中 N 是数组的大小)。我必须判断A[L...R]
子数组是否已排序。
例如,第一个查询要求我判断从索引 0 到 6(从 0 开始的索引)的子数组是否排序。答案是,A[0...6]
没有排序。 然后第二个查询要求我判断A[2...5]
是否排序。此子数组已排序。这是我处理它的方式。有没有更好的方法?
int main()
{
int a[7] = { 5, 4, 3, 7, 9, 11, 2}, k = 2;
for(int i = 1; i <= k; i++)
{
int l, r;
cin >> l >> r;
bool isSorted = true;
for(int j = l; j < r; j++)
{
if(a[j] > a[j + 1] )
{
isSorted = false;
break;
}
}
if(isSorted == true)
cout << "Sorted" << endl;
else
cout << "Not Sorted" << endl;
}
}
您可以对数据进行单次传递,在每个索引处存储列表减少的最接近的前一个索引。
然后,查询将包括从范围的右侧索引执行查找,并将结果值与范围的左侧索引进行比较。
int main(void)
{
constexpr int a[7] = { 5, 4, 3, 7, 9, 11, 2};
constexpr size_t k = 2;
constexpr size_t N = sizeof a/sizeof a[0];
size_t b[N];
{ /* preprocess */
size_t last_decrease = 0;
b[0] = 0;
for( int x = 1; x < N; ++x )
{
if (a[x] < a[x-1]) last_decrease = x;
b[x] = last_decrease;
}
}
for(int i = 0; i < k; i++)
{
int l, r;
std::cin >> l >> r;
bool isSorted = l >= b[r];
if (isSorted)
std::cout << "Sortedn";
else
std::cout << "Not Sortedn";
}
}
没有嵌套循环,因此此解决方案具有线性运行时。
相关文章:
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 是否有任何C++功能可以对地图进行排序?
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- 选择排序时交换函数调用的数量和完成的交换次数是否相同?
- 是否可以在调用链接器时强制 CMake 重新排序参数?
- 检查向量是否使用除法和阻抗算法进行排序
- 是否使用cv::Point2f类型重载std::排序
- "<"满足严格的弱排序是否意味着不需要"=="定义?
- 在这种单例实施中,是否可以对两个商店重新排序?
- 如何检查队列是否使用 STL 排序
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- 是否有用于排序和查找 c++ 中是否已存在的值的函数?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 是否可以在条件之前对加载或存储进行重新排序?
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- 此并发快速排序实现是否正确?
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 在独立类中对公共非虚拟方法重新排序是否会破坏 ABI
- STL排序是否支持UTF8 ?