用相同的顺序重新排列两个给定的数字,使它们之间可能的最小差异
给定两个N位正整数X和Y,任务是通过将两个整数的数字以相同的顺序重新排列来找到这两个整数之间可能的最小绝对差。
例子:
输入:X = 5181, y = 3663
输出:1482
解释:
按照(3、2、4、1)的顺序重新排列这两个给定整数的数字,将X和Y的值分别修改为8115和6633。
因此,两者之间的绝对差是(8115 - 6633)= 1482,这是可能的最小差。输入:X = 37198, y = 44911
输出:1278
方法:给定的问题可以通过找出每个变量之间的绝对差来解决排列的X和Y数字重排顺序相同的。按照以下步骤解决问题:
- 初始化一个二维数组arr [2] [n],它存储数字的数字X和Y分别。
- 例如,初始化一个数组P [],储存了数字[0,N - 1]的排列。
- 例如,初始化一个变量minDIff存储最小的差异X和Y。
- 遍历所有可能的排列的P []并执行以下步骤:
- 重新排列的数字X和Y根据排列和存储它们之间的绝对差说在一个变量中区别。
- 完成以上步骤后,更新minDIff的最小值minDiff和区别。
- 完成以上步骤后,打印的值minDIff作为最小的差异。
以下是上述方法的实施情况:
c++
// c++程序的上述方法
# include <比特/ stdc + + . h >
使用
命名空间
性病;
//函数找到最小差异
//在X和Y之间重新排列
//它们的数字顺序相同
㈡
minDifference (
㈡
X,
㈡
Y)
{
//存储最小差异
㈡
minDiff = INT_MAX;
//将数字X存储为字符串
字符串x = to_string(x);
//将数字Y存储为字符串
string y = to_string(y);
//存储数字数
㈡
n = x.size ();
//存储数字
㈡
a [2] [n];
//遍历范围[0,1]
为
(
㈡
我= 0;我< 2;我+ +){
//遍历范围[0,N - 1]
为
(
㈡
j = 0;j < n;j + +) {
//如果i的值为0
如果
(我= = 0)
A [i][j] = x[j] -
' 0 '
;
/ /否则
其他的
A [i][j] = y[j] -
' 0 '
;
}
}
//存储排列[1,N]
㈡
p [n];
//初始化排列阵列
为
(
㈡
我= 0;我< n;我+ +)
我[我]=;
//生成所有可能的排列
做
{
//存放X和Y的最大值
㈡
xx = INT_MIN;
//存储x和y的最小值
㈡
yy = INT_MAX;
//遍历范围[0,1]
为
(
㈡
我= 0;我< 2;我+ +){
//存储号码
//重新排列后
㈡
num = 0;
//遍历范围[0,N - 1]
为
(
㈡
j = 0;j < n;j + +)
//更新num的值
num = num * 10 + a [i] [p [j]];
//更新xx的值
Xx = max(Xx, num);
//更新YY的值
Yy = min(Yy, num);
}
//更新minDiff的值
minDiff = min(minDiff, xx - yy);
}
而
(next_permutation(p, p + n));
//返回最小的差异
返回
minDiff;
}
/ /驱动程序代码
㈡
主要的()
{
㈡
x = 37198,y = 44911;
cout << minfference(x,y);
返回
0;
}
|
输出:
1278
时间复杂度:O (N !)
辅助空间:O (1)
关注读者!现在不要停止学习。掌握竞争编程的所有重要数学概念基础数学CP课程以对学生友188bet2021欧洲杯好的价格。为了完成从学习一门语言到DS算法和更多的准备工作,请参考完整的面试准备课程金宝搏188beat。