• leetcode Subsets


    题目:

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

    Note:

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

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

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

    那么有几种情况呢,假设给你的数字长度为n的话。那么首先是空数组1;选一个呢,为n个;如此下去,一个的个数为2^n个子数组。


    这里给出一个java代码:

    import java.util.*;
    
    public class Solution {
        public List<List<Integer>> subsets(int[] S) {
            int totalLength  = 1<<S.length; //总共的子数组的个数
            List<List<Integer>>  l = new ArrayList<List<Integer>>();
            Arrays.sort(S);//数组进行排序
    
           
            for (int i=0;i<totalLength;i++){
                 ArrayList<Integer> tmp = new ArrayList<Integer>();
                for(int j=0;j<S.length;j++){
                    if(((i >> j) & 1 )!= 0){ //将s[n]分别用二进制的n-1位取代
                       tmp.add(S[j]); 
                    }
                   }
                l.add(tmp);
            }
        return l;
    	}
    	//測试主函数
        public static void main(String[] args) {
    		int[] array = {1,2,3};
    		Solution  s = new Solution();
    		System.out.println(s.subsets(array));
    	}
    }


    可能一下在看不懂上面的代码。特别是以下这段代码的意思。
     if(((i >> j) & 1 )!= 0)

    看一个图,例如以下



    上图中以S=[1 2 3 4]为样例,能够看到一个规律,就是在前面全部的subset的最后再加入一个位数,就成了新生成的subset。

    或者,我们简单的一理解为。s[0]代码二级制数字最后一位为1。s[1]代码二进制数字倒数第二位为1,如此下去。

    如上图中。倒数第二个subset为[2 3 4]。那么这代表着其用二级制表示为1110 = 14 这好是其外围数组的下标,这样不能理解上面列出的那个段代码了(或者例如以下)

     if(((i >> j) & 1 )!= 0)

    由上面图中的原理。这样就比較好的理解以下的python代码了:

    def subset1(S):
        A=[[]]
        S.sort()
    
        for n in S:
            for i in range(len(A)):
                ss = A[i][:] 
                ss.append(n) 
                A.append(ss)
        return A

    以下的python在原理上再效率上会有所提高:

    def subset2(S):
        res = [[]]
        S.sort()
    
        for n in S:
            res = res + [x + [n] for x in res]
    
        return res


  • 相关阅读:
    课后作业之评价
    课堂作业之寻找水王
    构建之法阅读笔记04
    课下作业
    构建之法阅读笔记03
    学习进度条九
    学习进度条八
    冲刺第五天
    构建之法阅读笔记02
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7269583.html
Copyright © 2020-2023  润新知