在这里我考虑使用全排列算法,来得到每一个排列,再去逐一去进行判断相邻两个数的差值。
全排列指:就是从第一个数字起每个数分别与它后面的数字交换
排列过程中需要考虑重复的数,因此需要去重,
去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换
不相同的n个数进行全排列,其排列值为n的阶乘(!n)
代码如下:
int total = 0;
//参数 数组 数组的起始位置 数组长度 差值
void Interview::sort_difValue1(int arr[], int index,int len, int dif)
{
//判断是否存在相同的数
auto iswap = [](int arr[], int begin, int end)
{
for (int i = begin; i < end; i++)
{
if (arr[i] == arr[end])
return false;
}
return true;
};
//两个数进行交换
auto swap = [](int arr[], int i, int k)
{
int tmp = arr[i];
arr[i] = arr[k];
arr[k] = tmp;
};
if (index == len)
{
static int s_i = 1;
cout << "排列" << s_i++ <<":";
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
//差值比较
bool status = true;
for (int i = 0; i < len-1; i++)
{
//排除两种情况(1.相邻数正常从小到大2.相邻数之差小于等于dif)
if ((arr[i] > arr[i + 1] && arr[i] - arr[i + 1] <= dif) || (arr[i] <= arr[i + 1]))
{
}
else {
status = false;
break;
}
}
if (status)
total++;
cout <<"是否:"<<status<<endl;
}
else
{
for (int i = index; i < len; i++)
{
if (iswap(arr, index, i))
{
swap(arr, i, index);
sort_difValue1(arr, index + 1, len, dif);
swap(arr, i, index);
}
}
}
}