O(n) 时间复杂度解决配对问题:桶排序实现
非哈希表的时间复杂度为 O(n) 的解决方案是使用桶排序的思想。以下是使用桶排序的算法实现:
#include <vector>
#include <cmath>
#include <limits>
bool checkPairs(const std::vector<int>& nums, int indexDiff, int valueDiff) {
int n = nums.size();
int minVal = std::numeric_limits<int>::max();
int maxVal = std::numeric_limits<int>::min();
for (int i = 0; i < n; i++) {
minVal = std::min(minVal, nums[i]);
maxVal = std::max(maxVal, nums[i]);
}
int bucketSize = valueDiff + 1;
int numBuckets = (maxVal - minVal) / bucketSize + 1;
std::vector<std::pair<int, int>> buckets(numBuckets, {-1, -1});
for (int i = 0; i < n; i++) {
int bucketIndex = (nums[i] - minVal) / bucketSize;
if (buckets[bucketIndex].first != -1) {
if (i - buckets[bucketIndex].first <= indexDiff) {
return true;
}
}
buckets[bucketIndex] = {i, nums[i]};
}
return false;
}
该算法首先找到数组中的最小值 'minVal' 和最大值 'maxVal',以确定桶的数量。
然后,根据 'valueDiff' 的大小确定桶的大小 'bucketSize'。并计算出需要多少个桶 'numBuckets' 来覆盖最小值到最大值之间的范围。
接下来,创建一个大小为 'numBuckets' 的桶数组 'buckets',每个桶中存储一个 '(index, num)' 的对,其中 'index' 是该数值在原数组中的下标,'num' 是该数值。
然后,遍历数组 'nums',对于每个数值,计算其所属的桶的索引 'bucketIndex',如果该桶已经存有数值,则判断当前下标 'i' 和该桶中存储的下标 'buckets[bucketIndex].first' 的差是否小于等于 'indexDiff',如果满足条件,则返回 'true'。如果不满足条件,则将当前数值存入该桶。
通过桶排序的思想,可以在一次遍历中找出满足条件的两个下标。
希望这次的回答能够帮助您解决问题。如果还有其他疑问,请随时提问。非常抱歉之前给出的错误答案造成的困扰。
原文地址: https://www.cveoy.top/t/topic/WOA 著作权归作者所有。请勿转载和采集!