给定一个char数组来表示CPU需要做的任务。它包含 大写字母A到Z,其中不同的字母代表不同 task.Tasks可以在没有原始订单的情况下完成。每项任务都可以 在一个区间内完成。对于每个间隔,CPU可以完成一项任务或 只是闲着。
然而,存在非负的冷却间隔n,意味着介于两者之间 两个相同的任务,CPU必须至少有n个间隔 不同的任务或只是闲着。
您需要返回CPU将占用的最小间隔数 完成所有给定的任务。 (来源:https://leetcode.com/problems/task-scheduler/#/description)
我的代码:
def least_interval(tasks, n)
calculate_smallest_interval(tasks, n, 0, 0)
end
def calculate_smallest_interval(tasks, n, index, occupied_task_count, cool_down = Hash.new { |h, k| h[k] = 0})
return 0 if tasks.empty?
index = 0 if index == tasks.length && !tasks.empty? # reset to the front
cool_down.each_key do |k|
cool_down[k] -= 1
occupied_task_count -= 1 if cool_down[k] < 0
end
curr_task = tasks[index]
if cool_down[curr_task] > 0
calculate_smallest_interval(tasks, n, index + 1, occupied_task_count, cool_down)
elsif occupied_task_count == tasks.length
# idle period
# don't increment index here because reconsider curr element
1 + calculate_smallest_interval(tasks, n, index, occupied_task_count, cool_down)
else
cool_down[curr_task] = n # set the cooldown timer
occupied_task_count = 1 # increment number of tasks in hash
1 + calculate_smallest_interval(tasks[0...index] + tasks[index + 1..-1], n, index, occupied_task_count, cool_down)
end
end
警告: 我现在明白,这个问题的深刻见解是你总是想要承担剩余实例数量最多的任务。没有降温才能获得最佳效果。但是,我仍然有兴趣了解我的代码在哪里出错,否则接近(因为我的输出远小于最佳结果)。
说明:
我有一个哈希表,可以跟踪冷却的所有相关任务。我还有一个索引变量,它递增以跟踪当前任务 - 如果当前任务可用,请保留它。
对于大型任务数组和高n值,我的输出明显低于最佳输出(所以我知道我错了)。这是一个较小但具有示范性的输入/输出组合:
IN: tasks = ['A','A','A','B','B','B'], n = 2
Correct output: 8
Mine: 7
有人可以告诉我他们在推理中看到了逻辑错误吗?