算法Day30 餐厅的套餐

餐厅的套餐

Description

假设有一家餐厅,菜单上有n道菜可供选择,现在需要从中选择k道菜组成一份套餐。请设计一个算法,返回所有可能但互不相同的菜品组合。

Input

不同菜品的id各不相同,分别为1,2,3…n,输入内容依次为n和k的值,输入内容之间使用空格隔开
1 ≤ n ≤ 20
1 ≤ k≤n

Output

请你按照数组中元素由小到大的顺序输出结果,若两个数组中前m个元素相同,则根据第m+1个元素判断数组大小

例如:

n = 4 , k = 2时输出顺序为:

[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

输出内容要求:

输出结果中不同数字之间使用空格分开并顺序排列即可,输出结果中不含有回车

Sample

在这里插入图片描述

代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static ArrayList<Integer> all = new ArrayList<>();
    public static StringBuilder result = new StringBuilder();
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int group = scanner.nextInt();
        for(int i = 0;i<n;i++){
            all.add(i+1);
        }//输出
        for(int i =1;i<=n-group+1;i++) {
            ArrayList<String> temp = backTrack(i, group, 1);
            temp.stream().forEach(k->add(k));
        }
        System.out.print(result.toString());
    }
    public static void add(String s){
        result.append(s+" ");
    }
    public static ArrayList<String> backTrack(int start,int group,int s){
        ArrayList<String> temp = new ArrayList<>();
        if(s==group){
            temp.add(String.valueOf(start));
            return temp;
        }
        //1-n
        for(int i = start;i<all.size();i++){
            {
                ArrayList<String> temp1 = backTrack(i + 1, group, s + 1);
                for (String k : temp1) {
                    temp.add(start + " " + k);
                }
            }
        }
        return temp;
    }
}

思路

按照题解使用回溯法,对每一层进行遍历,遍历至group层即可,我这里使用string保存信息。
大规模时使用result保存信息,我首先使用的直接是String类型保存
如图,直接超时在这里插入图片描述
之后采取StringBuilder在这里插入图片描述
在对大长度字符串处理时,还是StringBuilder比较合适

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值