这是一个黑客问题。 找出可以观看的最多电影。假设列表是不同的电影。
输入: movieStart [] = {10,12,9,14,16,14}
movieEnd [] = {11,13,15,16,18,18}
输出:4(10-11,12-13,14-16,16-18)
下面的代码给出了正确的输出。想知道这个问题可能的最佳解决方案。 还有什么算法用来解决这类问题?
static int getMaxMovies(int[] movie_start, int[] movie_end) {
int cnt = 0;
for (int i = 0; i < movie_start.length; i++) {
for (int j = 0; j < movie_start.length; j++) {
if (movie_start[j] == movie_start[i] && movie_end[j] == movie_end[i]) {
continue;
}
if (movie_start[j] >= movie_start[i] && movie_end[j] <= movie_end[i]) {
cnt += 1;
break;
}
}
}
return movie_start.length - cnt;
}
答案 0 :(得分:0)
那&#34;活动选择&#34;问题 - 可以使用O(n)
(在排序输入的情况下)或O(nlogn)
(当输入未排序时)贪婪算法轻松解决。如果输入已经按完成(结束)时间排序,您应该选择与之前选择的电影不冲突的电影。
伪代码:
Sort by finish times
int previouslySelectedIndex = 0;
int watchedMoviesCount = 1;
for (int i=1; i<movie_end.Length; i++)
{
if (movie_start[i] >= movie_end[previouslySelectedIndex)
{
watchedMoviesCount++;
previouslySelectedIndex=i;
}
}