这题通过找规律可以发现是一个类似斐波那契数列的二阶问题,常规解法就是使用递归或者改迭代,但是这个复杂度就是O(N)的。
可以有一种矩阵快速幂乘来优化的算法。

    public int rectCover(int target) {
        if(target==0||target==1||target==2) return target;
        /*int preTwo = 1;
        int preOne = 2;
        int temp;
        for(int n = 3;n<=target;n++){
            temp = preOne+preTwo;
            preTwo = preOne;
            preOne = temp;
        }
        return preOne;*/
        //类似斐波那契数列,|F(n),F(n-1)| = |F(2),F(1)|*(二阶矩阵)^(n-2)
        int[][] matrixRes = matrixPow(new int[][]{{1,1},{1,0}},target-2);
        return 2*matrixRes[0][0] + matrixRes[1][0];
    }
    //返回矩阵的n次方,快速幂乘算法
    public int[][] matrixPow(int[][] matrix,int n){
        int[][] temp = null;
        int[][] res = null;
        do{
            temp = temp == null?matrix:matrixMul(temp,temp);
            if((n&1)!=0){
                res = res==null?temp:matrixMul(res,temp);
            }
        }while((n>>>=1)!=0);
        return res;
    }
    public int[][] matrixMul(int[][] mA,int[][] mB){
        int rows = mA.length;
        int cols = mB[0].length;
        int[][] res = new int[rows][cols];
        for(int row = 0;row<rows;row++){
            for(int col = 0;col<cols;col++){
                for(int i = 0;i<mA[0].length;i++){
                    res[row][col] += mA[row][i] * mB[i][col];
                }
            }
        }
        return res;
    }