这个问题很难说。希望这是有道理的。
我的库存中有一个项目表。
我们称之为Apple,Orange,Pear,Potato。我想挑一篮水果(1 x Apple,1 x Orange,1 x Pear)。
INVENTORY中的每个项目都有不同的可用日期。所以...
我不想按照它们在广告资源中显示的顺序选择项目。相反,我想根据可以挑选所有项目的最小日期范围来选择它们。即橘子&苹果在APRIL和梨在五月。
我不确定这是否是MYSQL或某些PHP数组的问题。我很难过。提前谢谢。
答案 0 :(得分:1)
如果水果数组尚未按日期排序,请对其进行排序。
现在,简单的O(n ^ 2)解决方案是检查所有可能的范围。没有特定语言的伪代码:
for (int i = 0; i < inventory.length; ++i)
hash basket = {}
for (int j = i; j < inventory.length; ++j) {
basket.add(inventory[j]);
if (basket.size == 3) { // or whatever's the number of fruits
// found all fruits
// compare range [i, j] with the best range
// update best range, if necessary
break;
}
}
end
你可能会发现它已经足够了
或者你可以写一些更复杂的O(n)解决方案。它只是一个滑动窗口[first, last]
。在每一步中,我们移动左边界(不包括篮子中的一个水果)或右边(在篮子中添加一个水果)。
int first = 0;
int last = 0;
hash count = {};
count[inventory[0]] = 1;
while (true) {
if (count[inventory[first]] > 0) {
--count[inventory[first]];
++first;
} else if (last < inventory.length) {
++last;
++count[inventory[last]];
} else {
break;
}
if (date[last] - date[first] < min_range
&& count.number_of_nonzero_elements == 3) {
// found new best answer
min_range = date[last] - date[first]
}
}
答案 1 :(得分:0)
鉴于您的表库存是结构化的:
fruit, availability
apple, 3 // apples in march
//user picks the availability month maybe?
$this_month = 5 ;
//or generate it for today
$this_month = date('n') ;
// sql
"select distinct fruit from inventory where availability = $this_month";
答案 2 :(得分:0)
听起来很复杂。我将解决问题的方法是将每个水果分组到其可用月份组中,并查看每组中有多少水果。
要看到最多的水果属于APRIL。所以APRIL因此是我们的首选月份。
然后我会删除带有重复项的几个月的项目(在您的示例中为苹果),这将删除MARCH作为选项。此步骤可以立即完成,也可以在下一步之后完成,具体取决于您的数据和获得的结果。
然后我会看下一个最受欢迎的月份并计算当月的距离(例如,JAN距离APRIL 3,MARCH是1等)。如果你有一个平局,那么你选择哪个并不重要。在这个例子中,尽管你最终会根据你的要求选择APRIL中的2个水果和来自MAY的1个水果。
如果最受欢迎的月份实际上并未导致“最佳”选择,则此方法可能无效。