给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 k 。问最多能选择多少个数?
输入描述:
第一行输入两个正整数 n和k。
第二行输入 n个正整数ai,用空格隔开,表示这个数组。
输出描述:
一个正整数,代表能选的最多数量。
数据范围:
1≤n≤2×10^5
1≤k,ai≤10^9
示例1
输入:
5 3
2 1 5 3 2
复制
输出:
4
复制
说明:
显然,1和5不能同时选。所以最多只能选4个数。
由题知,可以先排序,寻找最大值与最小值的差在差值范围内的最大值与最小值,计算允许差值区间的数据个数,更新最大与最小值,计算个数,取个数最大值为结果
#include
#include
#include
using namespace std;
int main()
{
int n,gap,ret;
cin>>n>>gap;
vector<int>v;
for(int i=0;i<n;i++)
{
cin>>ret;
v.push_back(ret);
}
sort(v.begin(),v.end());
int l=0,res=0;
for(int i=0;i<n;i++)
{
while(v[i]-v[l]>gap)
l++;
res=max(res,i-l+1);
}
cout<<res;
return 0;
}
class Solution {
public:
//重载比较
static bool cmp(Interval &a, Interval &b) {
return a.start < b.start;
}
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> res;
//去除特殊情况
if(intervals.size() == 0)
return res;
//按照区间首排序
sort(intervals.begin(), intervals.end(), cmp);
//放入第一个区间
res.push_back(intervals[0]);
//遍历后续区间,查看是否与末尾有重叠
for(int i = 1; i < intervals.size(); i++){
//区间有重叠,更新结尾
if(intervals[i].start <= res.back().end)
res.back().end = max(res.back().end, intervals[i].end);
//区间没有重叠,直接加入
else
res.push_back(intervals[i]);
}
return res;
}
};
时间复杂度:O(n
log
2
\log2
log2n),排序的复杂度为O(n
log
2
\log2
log2n),后续遍历所有区间的复杂度为O(n),属于低次幂,忽略
空间复杂度:O(1),res为返回必要空间,没有使用额外辅助空间