如何找到';最大绝对和';具有一组整数的函数的 我试图在C++中解决这个问题,努力寻找一个O(1)的解决方案。
给定一个由四个整数组成的输入数组,将它们按如下顺序排列:如何找到';最大绝对和';具有一组整数的函数的 我试图在C++中解决这个问题,努力寻找一个O(1)的解决方案。,c++,algorithm,math,C++,Algorithm,Math,给定一个由四个整数组成的输入数组,将它们按如下顺序排列:F(s)=abs(s[0]-s[1])+abs(s[1]-s[2])+abs(s[2]-s[3])为最大值(绝对值) 如果每个整数都是唯一的,则最多有24次可能的随机洗牌 e、 g 拖到 A=5, B=-1, C=5, D=3 会导致 F(s) = 14; 这个算法应该是O(1) 注意正负整数的混合 F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3]) 如果您从0、a、a+b、a
F(s)=abs(s[0]-s[1])+abs(s[1]-s[2])+abs(s[2]-s[3])
为最大值(绝对值)
如果每个整数都是唯一的,则最多有24次可能的随机洗牌
e、 g
拖到
A=5, B=-1, C=5, D=3
会导致
F(s) = 14;
这个算法应该是O(1)
注意正负整数的混合
F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])
如果您从
0、a、a+b、a+b+c
(使用a
、b
、c
正数)进行所有排列,您将看到最大值为:
a,a+b+c,0,a+b
- 通过对称
a+b,0,a+b+c,a
2*a+3*b+2*c
)
不可读的解决方案(“排序”到位):
int重新排列(int&a)[4])
{
if(a[3]}//具有固定大小输入的[2]O(1)
没有什么意义……因为检查24种可能性是O(1)
…可能赋值的设置器只是意味着,无论输入值是多少(具有固定大小输入的4),代码都应该花费恒定的时间运行?您需要回到他们那里,澄清他们的意思,因为@Jarod42是正确的,O(1)
对于固定大小的输入没有多大意义。您找到了什么解决方案?是什么让您认为他们不是O(1)
?显示a。使用多个输入检查24种可能性。您看到模式了吗?您是否有只使用正数的不同策略?混合符号时正值/负值在哪里?最小值/最大值(绝对值)在哪里值?W.L.O.g,你可以只考虑非负数,因为如果你给每个值加一个常量,答案是不变的。@ Kvutur: <代码> { 1, 8, 2,4 } <代码> -> 15,而<代码> { 4, 1, 8,2 } < /代码> -16。
F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])
int rearrange(int (&a)[4])
{
if (a[3] < a[2]) {
std::swap(a[3], a[2]);
} // a[2] <= a[3]
if (a[1] < a[0]) {
std::swap(a[1], a[0]);
} // a[2] <= a[3] && a[0] <= a[1]
if (a[0] < a[2]) {
std::swap(a[0], a[2]);
} // a[2] <= a[3] && a[2] <= a[0] <= a[1] -> a[2] is the min
if (a[1] < a[3]) {
std::swap(a[1], a[3]);
} // a[2] <= a[3] <= a[1] && a[2] <= a[0] <= a[1] -> a[1] is the max
if (a[3] < a[0]) {
std::swap(a[3], a[0]);
} // a[2] <= a[0] <= a[3] <= a[1]
// as we know order, we might get rid of abs:
// (a[1] - a[0]) + (a[1] - a[2]) + (a[3] - a[2]);
return -a[0] + 2 * a[1] - 2 * a[2] + a[3];
}