文章目录
最长的可整合子数组的长度
题目
可整合数组的定义:如果一个数组在排序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。如[5, 3, 4, 6, 2]排序之后为[2, 3, 4, 5, 6]。符合每相邻两个数差的绝对值为1.所以这个数组为可整合数组。
给定一个整型数组arr,返回其中最大可整合子数组的长度。
代码
逐个子数组排序后进行判断的话复杂度比较高,达到O(N^3logN)。可以用max-min == j - i这种方式来判断。这样可以将排序的O(NlogN)降到O(1)
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
bool isIntegrated(vector<int> arr, int left, int right)
{
int subLen = right - left + 1;
vector<int> newArr(subLen, 0);
for (int i = 0; i < subLen; i++)
newArr[i] = arr[i + left];
sort(newArr.begin(), newArr.end());
for (int i = 1; i < subLen; i++)
{
if (newArr[i - 1] != newArr[i] - 1)
return false;
}
return true;
}
int getLIL1(vector<int> arr)
{
if (arr.size() < 1)
return 0;
int size = arr.size();
int len = 0;
for (int i = 0; i < size; i++)
{
for (int j = i; j < size; j++)
{
if (isIntegrated(arr, i, j))
len = max(len, j - i + 1);
}
}
return len;
}
int getLIL2(vector<int> arr)
{
if (arr.size() < 1)
return 0;
int size = arr.size();
int len = 0;
int Max = 0;
int Min = 0;
set<int> s;
for (int i = 0; i < size; i++)
{
Max = INT_MIN;
Min = INT_MAX;
for (int j = i; j < size; j++)
{
if (s.find(arr[j]