我在我的大学的先前任务中发现了这个leetcode样式问题。 Assume您有一家在线服装店,并且有可变大小的产品。有些产品的尺寸多次相同,您不想有任何重复。假设产品的尺寸保持在大小n的阵列
size中。在阵列[i]中,每种尺寸增加[i]的价格增加了。
使所有尺寸独特所需的最低成本是多少?
例如,如果您的数组尺寸= [3,3,4,5]和成本= [5,2,3,1],则最低成本为5,以将数组修改为[3,5,4 ,6](修改第二个3两次,5一次:2*2 + 1 = 5)。
i实现了一个解决方案,我有一个优先级的队列,我可以在其中存储所有尺寸和成本对,按成本下降。该代码类似于以下伪代码:
var uniqueSizes = new HashSet<int>(); // maintain all unique sizes in a set
int totalCost = 0;
while (pq.Count > 0){
currentPair = pq.Dequeue();
currentSize = currentPair.Item1, currentCost = currentPair.Item2;
while(uniqueSizes.Contains(currentSize){
// keep increasing until I find a size that is not in the set
currentSize++;
totalCost += currentCost;
}
uniqueSizes.Add(currentSize);
}
return totalCost;
我的代码确实在所有测试上运行,但是超过了某些测试的时间限制。我期望这是因为我找不到一种在循环时替换内部的方法,直到找到不在集合中的水流之前,我一直在增加潮流。我将感谢任何建议,以使这一时间更加效率或在少于O(n^2)中执行的任何替代解决方案。
我还期望我提供的代码在最坏的情况下(外部:o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o )亚长, )。这个假设正确吗?
注:您可以用所需的任何语言解决此问题,我只关心算法或IDEA
元素需要从[mn,mn + n -1]中存在,其中mn是大小的最小元素,n是数组的长度。因此,我们应该尝试以最小的成本移动元素。由于尺寸必须是唯一的,因此我们只能将最大成本保持在特定的尺寸,以最大程度地减少总成本。将与当前大小相关的所有成本存储在优先级队列中,同时保持总跑步总数。弹出优先队列的顶部,并从运行总数中删除该成本,同时将其余成本添加到总成本中。通过在[Mn,Mn + n -1]上迭代进行每个尺寸完成。这在
O(nlogn)