Leetcode第279题使用回溯法超时

来源:8-5 回溯法解决组合问题的优化

幕布斯1098637

2019-05-23

class Solution {
    
    private int min;
    private int count;
    
    public int numSquares(int n) {
        if (n == 0 || n == 1)
            return n;
        
        min = n;
        count = 0;
        helper(n,count);
        return min;
    }
    
    private void helper(int remaining, int count){
        if ( remaining == 0){
            if (count < min)
                min = count;
        }
        
        for (int i = 1; i * i <= remaining; i ++){
            count ++;
            helper(remaining - i * i, count);
            count --;
        }
    }
}

老师你好,我使用回溯法去解了一下279-LeetCode,但是超时了,我测试了几个input,都得到了准确答案,所以我想我的解法应该是没有问题的,或许可能存在可以优化的地方?我使用的语言是java。


顺便问一下这道题用回溯法的时间复杂度是多少?我猜想是O(logn*log(n)),不知道对吗

写回答

1回答

liuyubobobo

2019-05-24

279用回溯是超时的。可以继续往后看,在将动态规划的时候,我会介绍记忆化搜索。这个代码很容易修改成记忆化搜索,就不会超时了。


这个问题严格的时间复杂度分析有些复杂。如果对此感兴趣,建议看算法导论中”主定理“一节,在详细地描述递归算法的复杂度分析。不过通常,面试不会用到。大体上,这个算法基本是O(n!)这个级别,注意,有一个叹号,是阶乘级别的。为什么,因为搜索过程中有大量重复。


你可以尝试一下,在本地运行,传入100甚至1000,看看需要多少时间(非常非常长!)然后分析一下,为什么会用这么长的时间?你可以在helper中,对remain进行打印输出,然后用一个更小的数字实验,你就会看到,helper处理了大量的重复值的计算。这些在动态规划一章我都会讲,学到了那里,再回头看,也不迟:)


继续加油!:)


0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程