提供一个简单的暴力法——Java版本

subsets

http://www.nowcoder.com/questionTerminal/c333d551eb6243e0b4d92e37a06fbfc9

  • 暴力法思路:
        遍历数组,当一个元素被选中时,子集就是前面所有的子集加上当前当元素。

  • 题目注意点:
        1、需要考虑空子集以及只有一个数字的子集情况
        2、所有的子集结果需要排序(自定义Comparator实现)

  • PS:解法不唯一,只提供一个简单易理解的思路,如有不对请指正!
    参考代码:

    import java.util.*;
    public class Solution {
      public ArrayList<ArrayList<Integer>> subsets(int[] S) {
          ArrayList<ArrayList<Integer>> reList = new ArrayList<>();
          reList.add(new ArrayList<Integer>());
          //保证顺序
          Arrays.sort(S);
          for(int num:S){
              ArrayList<ArrayList<Integer>> tmpList = new ArrayList<>();
              for(ArrayList<Integer> curr:reList){
                  //这个步骤是直接将curr转为新的Arraylist,然后在后面追加一个元素
                  tmpList.add(new ArrayList<Integer>(curr){{add(num);}});
              }
    
              for(ArrayList<Integer> newList:tmpList){
                  reList.add(newList);
              }
          }
           //自定义Comparator对象,自定义排序,按照长度和内部元素大小排序
          Comparator c = new Comparator<ArrayList<Integer>>() {
              @Override
              public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
                  // TODO Auto-generated method stub
                  if(o1.size() == o2.size()){
                     for(int i=0; i<o1.size(); i++){
                         if(o1.get(i) != o2.get(i)){
                             return o1.get(i) - o2.get(i);
                         }
                     }
                  }
                  return o1.size() - o2.size() ;
              }
          };
          reList.sort(c);
          return reList;
      }
    }
全部评论

相关推荐

饿魔:看到在线简历了吧
点赞 评论 收藏
分享
11-23 15:14
中原工学院 Java
程序员花海_:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务