将长度为n的数组分割成m个子数组的所有情况(JAVA实现)

将长度为n的数组分隔成m个子数组,可以看作是将m-1个分隔符插入原来数组的n-1个位置中,所以我们只需要求出这m-1个分隔符在原来数组中的下标索引,即可得到子数组的所有情形。所以问题就转换成在n-1个 位置中寻找m-1个分隔符,一共有C_(n-1)(m-1)种情况,我们采用回溯法来生成所有情形:


import java.util.ArrayList;
import java.util.List;

/*
 把一个长度为n的数组分成m份的所有情况(n>=m)
 本质上是将m-1个分隔符插在n-1个不同的位置
 */
public class test{
    static ArrayList path = new ArrayList<>();
    static ArrayList> ans = new ArrayList<>();

    public static void main(String[] args) {
        int m = 3;
        int n = 5;
        insert(0,n-1,m-1);
        System.out.println(ans);
    }
// 这里jindu用来记录前面分好的部分,res_n表示剩下的可以插的位置数,res_m表示剩下的分隔符数量。
    static void insert(int jindu,int res_n,int res_m){
        if(res_m==0){
            ans.add(new ArrayList<>(path));
            return;
        }
        if(res_n < res_m) {
            return;
        }else if(res_m==res_n) {
            for (int i = 0; i (path));
        }else{
            for (int i = 0; i 

如果我们令m=3,n=5的话,输出就是


image.png

这里的每个数字可以当成分隔符在原数组中的位置,比如[1,2]表示我们分别在nums[1]和nums[2]左边插入分隔符,将其分成3份。

你可能感兴趣的:(将长度为n的数组分割成m个子数组的所有情况(JAVA实现))