我一直致力于解决问题,我需要将矩形网格(M * N)拆分为最小数量的方格网,让我给出一个实例的想法..
让我们考虑8 * 5网格。我们可以取出的第一个最大元素是5 * 5它将被遗漏3 * 5之后我们可以取出的最大矩形是3 * 3之后它是2 * 3我们可以拆分为2 1 * 1网格我需要一个更好的算法,时间复杂度更低,因为上面提到的算法需要更多的时间....感谢关于..
答案 0 :(得分:2)
这个问题相当于找到两个数字的GCD(最大公约数)。
这就是我们如何通过一个例子来查找对(200x117)
的GCD所以,我们可以做的是使用经典的Euclid algorithm:
如果我们有一个矩形尺寸(a,b) and a >= b
- >创建a/b
方块大小(b, b)
并解决矩形大小(b, a % b)
的子问题,并继续,直到我们到达(x, 0)
伪代码
void gcd(int a, int b){
if(b == 0)
return;
print a/b squares with size b x b;
gcd(b, a % b);
}
时间复杂度应为O(log max(a,b))
因此,对于情况(5,4),首先,我们创建一个正方形(4,4) - >剩下的是if(4,1) - >创建4个正方形大小(1,1) - > (1,0) - >返回;