假设我有以下两个数组,同时还有一个keyValue
对象。
int[] values = {3, 1, 1, 2, 3};
int[] keys = {6, 5, 5, 6, 9};
int keyValue = 7;
我正在尝试为value
找到小于key
的最大keyValue
。在上面的例子中,我们正在寻找7.在这种情况下,正确的答案是3,因为最大的key <= 7
是6. keys
中的6的索引是0和3.所以我会查看value[0]
和value[3]
,找出最大的value[0] = 3
。
如果我重新排序keys
,我需要求助于确保索引匹配,所以我希望两个列表保持一致。
我可以使用强力算法并执行类似这样的操作
int foundValue = 0;
int foundKey = 0;
Foreach ( int x = 0; x < keys.length; x++ ){
if ( keys[x] <= keyValue && keys[x] >= foundKey) {
foundKey = keys[x];
if(values[x] > foundValue){
foundValue = values[x];
}
}
}
虽然有效,但并不是那么优雅。问题是我实际上需要根据更改values[x]
对keyValue
求和,而不能包含重复。例如
keyValue = 7 : foundValue = 3
keyValue = 7 : foundValue = 2 //because value[0] was already used
keyValue = 5 : foundValue = 1
keyValue = 10 : foundValue = 3
keyValue = 7 : foundValue = 1 //because all the 6 and one 5 value are used
是否有比蛮力更好的方法来解决这个问题?
答案 0 :(得分:1)
让我们忽略&#34;优雅&#34;对当下的要求,并首先处理真正的问题,这就是你
需要根据更改的
values[x]
对keyValue
求和,并且不能 包括重复。
要防止重用值,您应该添加used[]
数组,如下所示。以下算法还允许通过添加keyValue
循环来更改while
:
int[] values = {3, 1, 1, 2, 3};
int[] keys = {6, 5, 5, 6, 9};
bool[] used = {false, false, false, false, false};
int keyValue;
while (<We have a new keyvalue to try>) {
keyValue = <new value>;
int foundValue = 0;
int foundKey = 0;
Foreach ( int x = 0; x < keys.length; x++ ){
if ( keys[x] <= keyValue &&
keys[x] >= foundKey &&
!used[x])
{
foundKey = keys[x];
if(values[x] > foundValue) {
foundValue = values[x];
used[x] = true;
}
}
}
}
为了使上述更优雅,您可以执行以下操作:
used[]
数组中至少有一个条目是false
,因为如果全部都是true
,那么算法就可以暂停了。< / LI>