zoukankan      html  css  js  c++  java
  • lintcode17- subsets- medium

    Given a set of distinct integers, return all possible subsets.

     Notice
    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.
    Example

    If S = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
    
    Challenge

    Can you do it in both recursively and iteratively?

    用递归写,每次给当前subset加从startIdx开始的后续元素,并调用自身。

    记得三步走,for循环内部 1先加,2deepcopy放到result里,3删去加的元素

    有一点对于123456,当下为13时的

    134,自调,13,135,自调,13,136,自调,13这样的感觉。

    1.如果题目要你subset有非降序要求,记得先对输入的nums排序。Arrays.sort(nums);

    2.递归的头private void helper(List<Integer> current, int startIdx, int[] nums, List<List<Integer>> result){}

    3.对输入数组int[] a的情况,null和a.length == 0还是不一样的!分开考虑,后者要返回一个空集。

    4.切记加入结果的时候要deepcopy,不然你只是加了一堆同一个地址的物体,最终返回值是一群一样的为0的东西。

    5.有时候可以把结果存放的东西作为参数传入,这样就不需要给private函数返回什么东西了。

    public class Solution {
        
        /*
         * @param nums: A set of numbers
         * @return: A list of lists
         */
        public List<List<Integer>> subsets(int[] nums) {
            // write your code here
            if (nums == null){
                return null;
            }
            
            List<List<Integer>> result = new ArrayList<>();
            List<Integer> blank = new ArrayList<Integer>();
            result.add(blank);
            
            if (nums.length == 0){
                return result;
            }
            
            //切记先sort,题目要求你非降序subsets
            Arrays.sort(nums);
            helper(blank, 0, nums, result);
            return result;
        }
        
        private void helper(List<Integer> current, int startIdx, int[] nums, List<List<Integer>> result){
            
            for(int i = startIdx; i < nums.length; ++i){
                current.add(nums[i]);
                
                result.add(new ArrayList<Integer>(current));
                helper(current, i + 1, nums, result);
                
                current.remove(current.size() - 1);
            }
            
        }
    }
  • 相关阅读:
    day14
    day13
    装饰器小题
    day12
    tes..
    1380 没有上司的舞会
    算法模板——KMP字符串匹配
    算法模板——Tarjan强连通分量
    3211: 花神游历各国
    1131: [POI2008]Sta
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7566475.html
Copyright © 2011-2022 走看看