zoukankan      html  css  js  c++  java
  • 程序员面试金典--集合的子集

    程序员面试金典--集合的子集

    题目描述

    请编写一个方法,返回某集合的所有非空子集。

    给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。

    测试样例:
    [123,456,789]
    返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}

    看到牛客网的discuss上的, 使用二进制,二进制每次减去1, 则其二进制数的字典序降一。( 二进制逐次减一,就得到一串字典序(从高到低的))

    class Subset {
    public:
    
        vector<vector<int> > getSubsets(vector<int> A, int n) {
            // write code here
            sort(A.begin(), A.end());  
            
            int num = 1 << n; 
            
            vector<vector<int> > ans; 
            
            for(int i= num - 1; i>0; --i) {
                vector<int> tmp; 
                
                for(int j=n-1; j>=0; --j) {
                    if( (i >> j) & 1 ) {
                        tmp.push_back(A[j]); 
                    }  
                }
                
                ans.push_back(tmp); 
            }
            
            return ans;  
        }
    };
    

      

  • 相关阅读:
    站立会议第八天
    Servlet基础知识
    JSP基础知识
    JSP基础知识
    JDBC工具包
    JDBC
    MySQL
    ASP.NET程序代码优化的七个方面
    中小型软件项目开发一般流程建议
    理解九种图
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/7202858.html
Copyright © 2011-2022 走看看