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);
            }
            
        }
    }
  • 相关阅读:
    监控注册表和文件夹改动
    Windows中根据GetLastError的错误代码,取得文字描述
    VBA 读取文件/写入文件
    (转)ansi,gb2312,gbk,gb18030,unicode,utf8,unicode big endian编码的区别及什么是BOM
    VBA 打开文件对话框
    修改GitHub记录中的invalidemailaddress
    使用DWM实现Aero Glass效果
    RAII(C++必知必会 条款40)
    C函数包装ASM代码时,指针无法传值的问题
    msysgit color.ui auto is invalid msysgit无法开启彩色显示
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7566475.html
Copyright © 2011-2022 走看看