526. Beautiful Arrangement

emmm,是不是要生成全排列然后一个一个序列判断啊。。感觉要先生成全排列

class Solution {
    int res = 0;
    private void countIth( int N , int pos , int[] used){
        if( pos > N ){
            res++;
            return;
        }
        else{
            for( int i = 1 ; i <= N ; i ++ ){
                if( used[ i ] == 0 && ( i % pos == 0 || pos % i == 0 )){
                    used[ i ] = 1;
                    countIth( N , pos + 1 , used );
                    used[ i ] = 0;
                }
            }
        }
    }
    
    public int countArrangement(int N) {
        if( N == 0 )return 0;
        countIth( N , 1 , new int[ N + 1 ] );
        return res;
    }
}

 感觉更为标准一点的全排列写法:

class Solution {
    int res = 0;
    
    private void permutation( int start , int[] nums ){
        if( start == 0 ){
            res ++ ;
            return;
        }
        for( int i = start ; i > 0 ; i -- ){
            if(  start % nums[ i ] == 0 || nums[ i ] % start == 0 ){
                swapp( nums, i  , start);
                permutation( start - 1 , nums );
                swapp( nums,  i , start );
            }
        }
    }
    void swapp( int[] nums , int a , int b ){
        int tmp = nums[a];
        nums[a ]= nums[b];
        nums[b] = tmp;
    }
    public int countArrangement(int N) {
        if( N < 1 )return 0;
        int[] nums = new int[ N + 1 ];
        for( int i = 1 ; i <= N ; i ++ )nums[ i ] = i;
        permutation( N , nums );
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40801853/article/details/82534432