我已经做了所有可能的刷卡,然后在最后我已经通过了数组,以检查它是否增加。这就是问题所在,我编写了递归方法如下
class Solution {
public int minSwap(int[] A, int[] B) {
return helper(A,B,0,0);
}
boolean helper2(int[] A,int[] B){
for(int i=0;i<A.length-1;i++){
if(A[i]>=A[i+1] || B[i]>=B[i+1])
return false;
}
return true;
}
int helper(int[] A,int[] B,int i,int swaps){
if(i==A.length && helper2(A,B)==true)
return swaps;
if(i==A.length)
return 1000;
swap(A,B,i);
int c=helper(A,B,i+1,swaps+1);
swap(A,B,i);
int b=helper(A,B,i+1,swaps);
return Math.min(b,c);
}
private void swap(int[] A, int[] B, int index){
int temp = A[index];
A[index] = B[index];
B[index] = temp;
}
}
在这里,我已经尝试了所有可能的刷卡,然后检查他们,并返回了一个最小的刷卡。我该怎么做这个的记忆。我应该在这个代码的记忆中使用哪些变量。有没有选择记忆变量的经验法则?
1条答案
按热度按时间v64noz0r1#
维基百科说:
在计算中,记忆是一种优化技术,主要用于存储昂贵函数调用的结果,并在相同输入再次出现时返回缓存结果,从而加快计算机程序的速度。
自
A
以及B
不要改变,输入是i
以及swaps
,所以对于这两种情况的每一个组合,我们都需要存储结果。一种方法是使用
HashMap
使用具有2个值的键,例如。然后可以在开始处添加以下内容
helper()
,尽管您可能希望在这两个之后添加它if
声明:然后更换
return
声明内容:是否
cache
字段或参数的传递完全由您决定。