我需要得到许多将数组划分成小的子数组的可能方法。我们可以垂直和水平分割数组。我的算法效果很好,但时间复杂性太差。你可以看看如何改进它?递归分割数组
参数
nStart
- 子阵列
nEnd
的第一行 - 子阵列
mStart
,mEnd
的最后一行 - 是用于第二维(列)。
check()
- 功能检查结束条件
return
- 不同的方式来划分数字阵列。功能检查时分,返回true
。
public static long divide(int nStart, int nEnd, int mStart, int mEnd) {
long result = 0;
for(int i = 1; i < nEnd - nStart; i++) {
if(check(nStart, nStart + i, mStart, mEnd) && check(nStart + i, nEnd, mStart, mEnd))
result += divide(nStart, nStart + i, mStart, mEnd) * divide(nStart + i, nEnd, mStart, mEnd);
}
for(int i = 1; i < mEnd - mStart; i++) {
if(check(nStart, nEnd, mStart, mStart + i) && check(nStart, nEnd, mStart + i, mEnd))
result += divide(nStart, nEnd, mStart, mStart + i) * divide(nStart, nEnd, mStart + i, mEnd);
}
return (result == 0 ? 1 : result) % 1000000000;
}
例
输入
2 2 10 01
输出2
输入
3 2 101 010
输出5
我想你需要知道check()
功能是如何工作的。当下一个子阵列只有一个或只有零时,我们停止分割。这里是代码:
public static boolean check(int nStart, int nEnd, int mStart, int mEnd) {
if((nEnd - nStart) + (mEnd - mStart) == 2)
return false;
for(int i = mStart; i < mEnd; i++) {
for(int j = nStart; j < nEnd; j++) {
if(bar[i][j] != bar[mStart][nStart])
return true;
}
}
return false;
}
在我看来,这个问题可以在不使用递归的情况下解决。你可以请一些示例输入与输出预期?可能是2x2阵列。 –
请不要破坏你的帖子。 –
请不要破坏你的帖子。它有upvotes,所以人们认为它有价值。 – 2015-10-19 12:32:44