漫画:去掉一个数,如何让剩余的数乘积最大?

简介: 举个例子,给定如下数组:要删除哪个元素,才能使得剩余元素的乘积最大呢?


640.jpg640.jpg

—————  第二天  —————

640.jpg640.jpg640.jpg

举个例子,给定如下数组:

640.png

要删除哪个元素,才能使得剩余元素的乘积最大呢?

显然应该删除元素2:

640.png

剩余元素的乘积  = 5 X 8 X 6 X9 X 7 = 15120

640.jpgimage.gif

image.gif

640.jpg640.jpg640.jpg640.jpg


————————————


640.jpg640.jpg

image.gif

image.gif


小灰把面试题目告诉给了大黄......


image.gif640.jpg640.jpg640.png640.jpg640.jpg

image.gif


数组中哪个负数的绝对值最小呢?显然是元素-2:

image.gif640.png

我们删去元素-2,原本数组中的三个负数变成了两个,负负得正,而且保证了剩余元素的乘积最大。

image.gif

640.jpg640.jpg640.png640.jpg640.jpg

image.gif

image.gif

image.gif


数组中哪个非负元素最小呢?显然是元素3:

image.gif640.png

我们删去元素3,数组中剩余元素的乘积仍然是正数,而且绝对值最大。

640.jpg640.jpg640.png640.jpg640.jpg

数组中哪个负数元素的绝对值最大呢?显然是元素-9:image.gif

640.png

既然剩余元素的乘积无论如何都是负的,我们就索性删去绝对值最大的元素-9,使得剩余元素乘积的绝对值尽可能小。image.gif

640.jpg

总结一下,需要考虑的数组元素情况共有三种:



  • 情况A:奇数个负数
  • 情况B:偶数(包括0)个负数
  • 子情况:没有非负数


image.gif640.jpg640.jpg

image.gif


public
static
int
 findRemovedIndex
(
int
[]
 array
){
// 1.统计负元素的个数
int
 negativeCount 
=
0
;
for
(
int
 i
=
0
;
 i
<
array
.
length
;
 i
++){
if
(
array
[
i
]
<
0
){
            negativeCount 
++;
}
}
// 2.根据不同情况,选择要删除的元素
int
 tempIndex 
=
0
;
if
((
negativeCount
&
1
)==
1
){
//情况A:负数个数是奇数
for
(
int
 i
=
1
;
 i
<
array
.
length
;
 i
++){
if
(
array
[
i
]
<
0
){
if
(
array
[
tempIndex
]>=
0
||
 array
[
i
]>
array
[
tempIndex
]){
                    tempIndex 
=
 i
;
}
}
}
return
 tempIndex
;
}
else
{
//情况B:负数个数是偶数
if
(
array
.
length 
==
 negativeCount
){
//子情况:所有元素都是负数
for
(
int
 i
=
1
;
 i
<
array
.
length
;
 i
++){
if
(
array
[
i
]
<
 array
[
tempIndex
]){
                    tempIndex 
=
 i
;
}
}
return
 tempIndex
;
};
for
(
int
 i
=
1
;
 i
<
array
.
length
;
 i
++){
if
(
array
[
i
]
>=
0
){
if
(
array
[
tempIndex
]<
0
||
 array
[
i
]<
array
[
tempIndex
]){
                    tempIndex 
=
 i
;
}
}
}
return
 tempIndex
;
}
}
public
static
void
 main
(
String
[]
 args
)
{
int
[]
 array1 
=
{-
4
,
3
,-
5
,-
7
,-
21
,
9
,-
1
,
5
,
6
};
int
 index 
=
 findRemovedIndex
(
array1
);
System
.
out
.
println
(
"删除元素下标:"
+
 array1
[
index
]);
int
[]
 array2 
=
{
4
,
3
,
5
,-
7
,-
21
,
9
,-
1
,-
5
,
6
,
0
};
    index 
=
 findRemovedIndex
(
array2
);
System
.
out
.
println
(
"删除元素下标:"
+
 array2
[
index
]);
int
[]
 array3 
=
{-
4
,-
3
,-
5
,-
7
,-
21
,-
9
,-
1
,-
8
};
    index 
=
 findRemovedIndex
(
array3
);
System
.
out
.
println
(
"删除元素下标:"
+
 array3
[
index
]);
}

640.jpg640.jpg这段代码实现包含两步:

1.遍历数组,统计数组当中负数元素的个数。

2.根据负数元素的奇偶性,选择不同的处理方式。


image.gif640.jpg640.jpg640.jpg640.png

上面这个数组是典型的情况B,即负数个数是偶数的情况。那么要想让剩余元素乘积最大,我们只要删除最小的非负元素,也就是删除元素0即可:

image.gif640.png640.jpg


相关文章
|
9月前
|
算法 Java
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
83 0
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
【剑指offer】-数组汇总出现次数超过一半的数字-27/67
【剑指offer】-数组汇总出现次数超过一半的数字-27/67
遇7避过(输出1~100内的安全数,安全数不能带有7,不能被7整除
遇7避过(输出1~100内的安全数,安全数不能带有7,不能被7整除
82 0
剑指offer 40. 数组中出现次数超过一半的数字
剑指offer 40. 数组中出现次数超过一半的数字
100 0
剑指offer_数组---数组中出现次数超过一半的数
剑指offer_数组---数组中出现次数超过一半的数
61 0
|
C语言
求十个数中最大的数
C语言求十个数中最大的数流程图
72 0
求十个数中最大的数
AcWing 742. 最小数和它的位置
AcWing 742. 最小数和它的位置
78 0
AcWing 742. 最小数和它的位置
|
测试技术
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
486 0
1414. 和为 K 的最少斐波那契数字数目 : 详解为何「每次选择不超过当前 k 的最大数」的可行解为最优解
1414. 和为 K 的最少斐波那契数字数目 : 详解为何「每次选择不超过当前 k 的最大数」的可行解为最优解
|
C语言 UED
[解题报告]【第36题】给定一个数,判断这个数是不是素数
[解题报告]【第36题】给定一个数,判断这个数是不是素数
[解题报告]【第36题】给定一个数,判断这个数是不是素数