將長度為n的數(shù)組分割成m個子數(shù)組的所有情況(JAVA實現(xiàn))

將長度為n的數(shù)組分隔成m個子數(shù)組,可以看作是將m-1個分隔符插入原來數(shù)組的n-1個位置中,所以我們只需要求出這m-1個分隔符在原來數(shù)組中的下標索引,即可得到子數(shù)組的所有情形。所以問題就轉(zhuǎn)換成在n-1個 位置中尋找m-1個分隔符,一共有C_(n-1)(m-1)種情況,我們采用回溯法來生成所有情形:


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

/*
 把一個長度為n的數(shù)組分成m份的所有情況(n>=m)
 本質(zhì)上是將m-1個分隔符插在n-1個不同的位置
 */
public class test{
    static ArrayList<Integer> path = new ArrayList<>();
    static ArrayList<List<Integer>> 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表示剩下的可以插的位置數(shù),res_m表示剩下的分隔符數(shù)量。
    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 <res_m; i++) {
                path.add(jindu+i+1);
            }
            ans.add(new ArrayList<>(path));
        }else{
            for (int i = 0; i <res_n; i++) {
                path.add(jindu+i+1);
                insert(jindu+i+1,res_n-i-1,res_m-1);
                path.remove(path.size()-1);
            }
        }
    }
}

如果我們令m=3,n=5的話,輸出就是


image.png

這里的每個數(shù)字可以當成分隔符在原數(shù)組中的位置,比如[1,2]表示我們分別在nums[1]和nums[2]左邊插入分隔符,將其分成3份。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容