1. 程式人生 > >(lintcode)第17題 子集

(lintcode)第17題 子集

要求:給定一個含不同整數的集合,返回其所有的子集

注意事項:子集中的元素排列必須是非降序的,解集必須不包含重複的子集。

樣例

如果 S = [1,2,3],有如下的解:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
思路:不考慮非降序,一個個數字插進去,每一層插進去一個,每一個都有兩種情況,加進去和不加進去。就是遍歷數組裡面所有的元素,每次取出第一個list,往裡面加入,或者不加入,就有了兩種情況的list產生,再把這兩種list加進去,依次迴圈。


這樣的做法是降序的,不符合題意,但是在此處還是貼一下程式碼。

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
        ArrayList<List<Integer>> res=new ArrayList<List<Integer>>();
        ArrayList<Integer>list=new ArrayList<Integer>();
        if(nums==null ||nums.length == 0){
            return res;
        }
        res.add(list);
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<Math.pow(2,i);j++){
                List<Integer>temp=res.get(0);
                res.remove(0);
                ArrayList<Integer>temp2=new ArrayList<Integer>(temp);
                temp2.add(temp2.size(),nums[i]);
                res.add(temp2);
                res.add(temp);
            }
        }
        return res;
    }
}
我們看到上面程式碼的錯誤樣例如下: 輸入
[4,1,0]
輸出
[[],[0],[1],[1,0],[4],[4,0],[4,1],[4,1,0]]
期望答案
[[],[0],[0,1],[0,1,4],[0,4],[1],[1,4],[4]]
為什麼會這樣子呢,其實非降序這個要求只是一個幌子,我們只要在加入之前對陣列進行排序就可以通過啦。

程式碼如下:

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
        ArrayList<List<Integer>> res=new ArrayList<List<Integer>>();
        ArrayList<Integer>list=new ArrayList<Integer>();
        if(nums==null ){
            return res;
        }
        res.add(list);
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<Math.pow(2,i);j++){//每一層的個數都是2的n次方
                List<Integer>temp=res.get(0);
                res.remove(0);//把第一個取出來
                ArrayList<Integer>temp2=new ArrayList<Integer>(temp);
                temp2.add(temp2.size(),nums[i]);
                res.add(temp2);//加入一個數,放進去
                res.add(temp);//不加數,放進去
            }
        }
        return res;
    }
}


相關推薦

(lintcode)17 子集

要求:給定一個含不同整數的集合,返回其所有的子集 注意事項:子集中的元素排列必須是非降序的,解集必須不包含重複的子集。 樣例 如果 S = [1,2,3],有如下的解: [ [3], [1], [2], [1,2,3], [1,3], [2,3],

OCP考試17

17. The INV_HISTORY table is created using the command: SQL>CREATE TABLE INV_HISTORY (inv_no NUMBER(3), inv_date DATE, inv_amt NUMBER(10,2)) pa

C++面向物件程式設計50道程式設計17

C++面向物件程式設計50道程式設計題(第17題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

劍指offer_17_樹的子結構_Python

題目描述 輸入兩棵二叉樹A,B 判斷B是不是A的子結構。 其中空樹不是任意一個樹的子結構 class TreeNode: def __init__(self, x): self.val = x self.left = None

數理統計與資料分析三版習題 3章 17

以下解題過程都是由網際網路收集而來,並不保證正確,如有疑問可以留言討論 題目 令(X,Y)是隨機點,均勻地選自區域 R={(x,y):∣x∣+∣y∣≤1}R=\left\{(x,y):|x|+|y|\leq1 \right\}R={(x,y):∣x∣+∣y∣≤1

(lintcode)29交叉字串

比如 s1 = "aabcc" s2 = "dbbca"     - 當 s3 = "aadbbcbcac",返回  true.     - 當 s3 = "aadbbbaccc", 返回 false. 思路:這道題一開始我是使用三個下標分別對應3個字串,如果匹配上,那麼就會往後移一位,但是這樣就會有一個嚴

leetcode 78 子集 python解法(用時48ms)

leetcode 第78題 子集 python解法(用時48ms) 問題分析 該問題要求返回陣列的所有子集,一個數組子集的個數等於2的陣列長度次冪(2^(len(nums))。首先這道題有多種解法:有使用深度優先遍歷來做的,還有使用遞迴法來做,還有一種解法是使用位運算來計算。比如,陣

LeetCode17 電話號碼的字母組合

class Solution { public:     vector<string> letterCombinations(string digits) {         vector<string>ans;         if(digits.s

(lintcode)14二分查詢

要求:給定一個排序的整數陣列(升序)和一個要查詢的整數target,用O(logn)的時間查詢到target第一次出現的下標(從0開始),如果target不存在於陣列中,返回-1。 樣例:在陣列 [1, 2, 3, 3, 4, 5, 10] 中二分查詢3,返回2。 思路:使

LeetCode 17電話號碼的字母組合

i++ color link 17. ear else return void arr /*17. 電話號碼的字母組合給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。輸入:"23"輸出:

leetcode17——**Letter Combinations of a Phone Number

題目 Given a digit string, return all possible letter combinations that the number could represent. A mapping of digit to letters (just li

(lintcode)3統計數字

要求:計算數字k在0到n中的出現的次數,k可能是0~9的一個值。樣例例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我們發現1出現了5次

OCP-1Z0-051 17 null參與運算後仍是null

SQL>  SELECT ename||' joined on '||hiredate||      2  ', the total compensation paid is '||       3  TO_CHAR(ROUND(ROUND(SYSDATE-hiredate)/365) * sal +

復旦大學2017--2018學年第二學期(17級)高等代數II期末考試七大解答

-- 大學 for 其中 白皮書 $$ all 9.1 參考 七、(本題10分) 設 $A_1,A_2,\cdots,A_m$ 為 $n$ 階實對稱陣, 其中 $A_1$ 為正定陣, 並且對任意的 $2\leq i<j\leq m$, $A_iA_1^{-1}A_j

【吳恩達】機器學習17章推薦系統以及ex8推薦系統程式設計

1.基於內容的推薦系統 以電影推薦為例,先介紹以下引數: r(i,j)表示使用者j對於電影i是否進行了評分。1表示已經評分,0表示沒有評分。 表示使用者j對電影i的評分情況。總共1-5分。 表示對使用者j喜愛電影題材的描述情況.比如(0,5,0)表示每列分別對應玄

HDU 6172 Array Challenge (打表找規律+矩陣快速冪 17多校十場2)

題目連結 題意 分析 不得不佩服AC這道題的人腦洞,為什麼你們這麼熟練。。。打表找規律無所不能。 因為我們無法處理開方的取模問題,因此我們不能一步步求。我們令fn=⌊an−−√⌋,則打表

計蒜客--28:等和的分隔子集

第28題:等和的分隔子集 時間限制 1000 ms 記憶體限制 10000 K 曉萌希望將1到N的連續整陣列成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於N=3,對應的集合{1,2,3}能被劃分成{3} 和 {1,2}兩個子集合. 這兩

OCP-1Z0-051-題目解析-16

blog ror cau 花括號 pan 使用 data eval from 16. Evaluate the following query: SQL> SELECT promo_name q‘{‘s start date was }‘ promo_begi

OCP-1Z0-051-題目解析-21

spa true div 一個 swe ron column examine ons 21. Examine the description of the EMP_DETAILS table given below: name NULL

全排列(洛谷1061 Jam的計數法or NOIP 2006 普及組

div 順序 pre highlight 格式 其中 字符 是個 true Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文字母計數,他覺得這樣做,會使世界更加豐富多彩。 在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文字母按