搜索数组两次

时间:2014-08-29 14:25:51

标签: c algorithm

这是一个黑客问题。 找出可以观看的最多电影。假设列表是不同的电影。

输入: 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;

}

1 个答案:

答案 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;
    }
}