先给出可整合数组的定义。如果一个数组在排序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合每相邻两个数差的绝对值都为1,所以这个数组为可整合数组。给定一个整型数组arr,请返回其中最大可整合子数组的长度。例如,[5,5,3,2,6,4,3]中最大可整合子数组为[5,3,2,6,4],所以返回5。
分析:判断一个子数组是否为可整合,只需用哈希表判断是否有重复元素,无重复元素判断最大值减去最小值是否等于数组长度即可
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
int maxLen(vector<int> &nums) {
unordered_map<int, int> m;
int res = 0;
for (int i = 0; i < nums.size(); i++) {
int maxNum = INT_MIN, minNum = INT_MAX;
for (int j = i; j < nums.size(); j++) {
if (m.find(nums[j])== m.end()) { //没有重复值
m[nums[j]]++; //则记录kye,value
maxNum = max(nums[j], maxNum);//计算最大数
minNum = min(nums[j], minNum);//最小数
if (j-i==maxNum-minNum) //最大减去最小等于数组长
res =max(j - i+1,res); //得到结果
}
else break; //找到重复值,直接退出
}
m.clear(); //注意要清空哈希表
}
return res;
}
int main()
{
vector<int>v = {5,5,3,3,4,5,2,6,9,7,8,4,6,2 };
cout << maxLen(v) << endl;
}