题解——Leetcode 526. Beautiful Arrangement 难度:Medium

这篇博客探讨了LeetCode中难度为Medium的526题——Beautiful Arrangement。文章指出,一个美丽的排列需要满足每个位置上的数要么能整除该位置的索引,要么索引能整除该数。博主提出了解决问题的关键在于通过交换数组中任意两个位置的数来穷举所有可能的n个数的全排列,并计算其中符合条件的排列数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 ≤ i ≤ N) in this array:

  1. The number at the ith position is divisible by i.
  2. i is divisible by the number at the ith position.

Now given N, how many beautiful arrangements can you construct?

本题定义了一个美丽排列,须满足排列中所有下标和下表对应的数能相互整除,给定一个从1到N的数组,求由这些数构成的美丽排列的个数。

解题关键是通过交换任意两个位置的数穷举出n个数的全排列,然后判断符合条件的排列个数即是题目所求。

class Solution {
public:
    int countArrangement(int N) {
        vector<int> vs;
        for(int i = 0; i < N; i++)
            vs.push_back(i+1);
        return count(N, vs);
    }
    
    int count(int n, vector<int> vs){
        int res = 0;
        
        if(n <= 0)
            return 1;
        
        for(int i =0; i < n; i++){
            if(vs[i] % n == 0 || n % vs[i] == 0){
                swap(vs[i], vs[n-1]);
                res += count(n-1, vs);
                swap(vs[n-1], vs[i]);
            }
        }
        return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值