1. 程式人生 > >LeetCode 78. Subsets--輸出一個一維陣列的所有子集

LeetCode 78. Subsets--輸出一個一維陣列的所有子集

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

簡便方法如下:

While iterating through all numbers, for each new number, we can either pick it or not pick it
1, if pick, just add current number to every existing subset.
2, if not pick, just leave all existing subsets as they are.
We just combine both into our result.

For example, {1,2,3} intially we have an emtpy set as result [ [ ] ]
Considering 1, if not use it, still [ ], if use 1, add it to [ ], so we have [1] now
Combine them, now we have [ [ ], [1] ] as all possible subset

Next considering 2, if not use it, we still have [ [ ], [1] ], if use 2, just add 2 to each previous subset, we have [2], [1,2]
Combine them, now we have [ [ ], [1], [2], [1,2] ]

Next considering 3, if not use it, we still have [ [ ], [1], [2], [1,2] ], if use 3, just add 3 to each previous subset, we have [ [3], [1,3], [2,3], [1,2,3] ]
Combine them, now we have [ [ ], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3] ]

import java.util.*;

public class Solution_78_Subsets {

    public static void main(String[] args) {
        Solution_78_Subsets solution_78_subsets = new Solution_78_Subsets();
        System.out.println(solution_78_subsets.subsets(new int[]{1, 2, 3}));//2^3
        System.out.println(solution_78_subsets.subsets(new int[]{1, 2, 3, 4}));//2^4
    }

    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> resultList = new ArrayList<>();
        resultList.add(new ArrayList<Integer>());
        for (int num : nums) {
            int size = resultList.size();//加上該元素之後組成新集合,同時還會與原集合結合,會有複製和引用的問題,此處用size非常巧妙
            for (int i = 0; i < size; i++) {
                List<Integer> subList = new ArrayList<>(resultList.get(i));
                subList.add(num);//該元素加入每個子集
                resultList.add(subList);//該新的子集加入新的結果集
            }
        }
        return resultList;
    }
}

輸出:

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

相關推薦

LeetCode 78. Subsets--輸出一個陣列所有子集

Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate su

申明一個陣列跟二陣列 並都可以用print_r輸出

<body> <?php $php=array(1=>"PHP",2=>"JAVA",3=>"VB"); //宣告一個一維陣列 print_r($ph

【java】【判斷一個陣列是否對稱】

 思路:要判斷一個長度為n的一維陣列是否對稱,即判斷陣列下標為 i 的元素和下標為 n-1-i 的元素值是否相等(i=0,1,2...,n-1), package homework; import java.util.Scanner; public class Test_01 {

php統計一個陣列中,相同的值連續出現的最大次數

一維陣列: $array = [2,3,3,3,3,4,2,4,4,5,5,3,3,7,7,6,6,6,8,8,4,4,4,4,4,8,8,8,8,98,6,98,98]; 效果: Array ( [2] => 1 [3] => 4 [4] => 5 [5] =>

PHP將一個陣列,以其中列為KEY,列為VALUE,返回一個陣列

/** * 將一個二維陣列,以其中一列為KEY,一列為VALUE,返回一個一維陣列 * @param array $array * @param null $column_key * @param $index_key * @throws \Exception * @return a

php如何把一個陣列轉換成一個陣列

$arr=array( '0'=>array( 'a'=>2, 'b'=>'fd', 'c'=>'fgd', 'd'=>'hg', ), '1'=>array( 'e'=>2, 'b'=>'fd',

使用php和階乘原理 通過階乘獲取一個陣列中全部的組合情況

<?php /** * 通過階乘獲取一個一維陣列中全部的組合情況 * @param array $arr 要被組合的一維陣列 * @return array */ function getArrAllCombineByFactor($arr){ if(co

生成一個陣列,有10個元素,都用隨機數填充,用指標輪詢的辦法實現函式查詢個數是否存在。

題目:生成一個一維陣列,有10個元素,都用隨機數填充,用指標輪詢的辦法實現函式查詢一個數是否存在,具體實現程式碼如下: #include <stdlib.h> #include <stdio.h> #include <time.h&g

一個陣列所有陣列和的最大值(郭少周,陳澤)

小組成員:陳澤 郭少周 設計流程:     設計要求.:1. 輸入一個二維整形陣列,數組裡有正數也有負數。                     2.二維陣列中連續的

Java程式設計:定義一個int型的陣列,包含10個元素,分別賦一些隨機整數,然後求出所有元素的最大值,最小值,平均值,和值,並輸出出來。

public class Program1 {/**1.定義一個int型的一維陣列,包含10個元素,分別賦一些隨機整數,然後求出所有元素的最大值,最小值,平均值,和值,並輸出出來。*/public static void main(String[] args) { int[

Java 陣列實現一個棧(Stack)類

使用一維陣列編碼實現一個棧(Stack)類,要求提供以下操作:(1)boolean isEmpty():判斷棧當前是否為空;(2)入棧操作void push(obj):把資料元素obj插入堆疊;(3)出棧操作Object pop():出棧,並返回刪除的資料元素;(4)Object get

實現將陣列A(下標從1開始)中的元素迴圈右移k位,要求只用一個元素大小的輔助空間

#include<stdio.h>main(){ int n,arrary[50],k,temp; printf("請輸入陣列元素個數:\n"); scanf("%d",&n); for(int i=1;i<=n;i++) scanf

給二陣列中的每個陣列增加一個新的欄位

根據工作中遇到的問題,記錄一下給二維陣列中的每個一維陣列增加一個新的欄位的方法。 function addField($arrs,$message,$filed){     $lists = array();//一個空陣列,用來儲存增加了欄位一維陣列    

設計一個演算法,將陣列A(下標從1開始)中的元素迴圈右移k位,要求只用一個元素大小的附加儲存空間。給出演算法的時間複雜度。

程式碼 #include<stdio.h> #include<stdlib.h> #define n 10 int main() { int a[n] = { 0,1,2,3,4,5,6,7,8,9 }; int k, t=0,i,j,m; printf(

LeetCode - 55. Jump Game、45. Jump Game II、403. Frog Jump - 陣列跳躍問題 (多種方法)

55 - Jump Game  -  Medium 45 - Jump Game II  -  Hard 403 - Frog Jump - Hard 上邊三題都是一維陣列中的DP演算法題,一起總結一下: 55 - Jump

劍指off:在一個維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣一個維陣列一個整數,判斷陣列中是否含有該整數

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路: 從左下角x開始尋找,x為此列最大數字,此行最小數字。如果目

Solidify實現一個智慧合約10(陣列和二陣列

固定長度的陣列 固定長度型別陣列的宣告及其通過length方法獲取陣列長度求和。 pragma solidity ^0.4.4; /* 陣列一旦建立,長度不可變 但裡面的內容可變 */ contract Sz { //定義長為5的陣列,並對其初始化。 uint[