<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Subsets - 子集 ### Source - leetcode: [Subsets | LeetCode OJ](https://leetcode.com/problems/subsets/) - lintcode: [(17) Subsets](http://www.lintcode.com/en/problem/subsets/) ### Problem Given a set of distinct integers, *nums*, 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 *nums* = `[1,2,3]`, a solution is: ~~~ [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] ~~~ ### 題解 子集類問題類似Combination,以輸入數組`[1, 2, 3]`分析,根據題意,最終返回結果中子集類的元素應該按照升序排列,故首先需要對原數組進行排序。題目的第二點要求是子集不能重復,至此原題即轉化為數學中的組合問題。我們首先嘗試使用 [DFS](# "Depth-First Search, 深度優先搜索") 進行求解,大致步驟如下: 1. `[1] -> [1, 2] -> [1, 2, 3]` 1. `[2] -> [2, 3]` 1. `[3]` 將上述過程轉化為代碼即為對數組遍歷,每一輪都保存之前的結果并將其依次加入到最終返回結果中。 ### Python ~~~ class Solution: # @param {integer[]} nums # @return {integer[][]} def subsets(self, nums): if nums is None: return [] result = [] nums.sort() self.dfs(nums, 0, [], result) return result def dfs(self, nums, pos, list_temp, ret): # append new object with [] ret.append([] + list_temp) for i in xrange(pos, len(nums)): list_temp.append(nums[i]) self.dfs(nums, i + 1, list_temp, ret) list_temp.pop() ~~~ ### C++ ~~~ class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int> > result; if (nums.empty()) return result; sort(nums.begin(), nums.end()); vector<int> list; dfs(nums, 0, list, result); return result; } private: void dfs(vector<int>& nums, int pos, vector<int> &list, vector<vector<int> > &ret) { ret.push_back(list); for (int i = pos; i < nums.size(); ++i) { list.push_back(nums[i]); dfs(nums, i + 1, list, ret); list.pop_back(); } } }; ~~~ ### Java ~~~ public class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> list = new ArrayList<Integer>(); if (nums == null || nums.length == 0) { return result; } Arrays.sort(nums); dfs(nums, 0, list, result); return result; } private void dfs(int[] nums, int pos, List<Integer> list, List<List<Integer>> ret) { // add temp result first ret.add(new ArrayList<Integer>(list)); for (int i = pos; i < nums.length; i++) { list.add(nums[i]); dfs(nums, i + 1, list, ret); list.remove(list.size() - 1); } } } ~~~ ### 源碼分析 Java 和 Python 的代碼中在將臨時list 添加到最終結果時新生成了對象,(Python 使用`[] +`), 否則最終返回結果將隨著`list` 的變化而變化。 **Notice: backTrack(num, i + 1, list, ret);中的『i + 1』不可誤寫為『pos + 1』,因為`pos`用于每次大的循環,`i`用于內循環,第一次寫subsets的時候在這坑了很久... :(** 回溯法可用圖示和函數運行的堆棧圖來理解,強烈建議**使用圖形和遞歸的思想**分析,以數組`[1, 2, 3]`進行分析。下圖所示為`list`及`result`動態變化的過程,箭頭向下表示`list.add`及`result.add`操作,箭頭向上表示`list.remove`操作。 ![Subsets運行遞歸調用圖](https://box.kancloud.cn/2015-10-24_562b1f5a2e2ba.jpg) ### 復雜度分析 對原有數組排序,時間復雜度近似為 O(nlogn)O(n \log n)O(nlogn). 狀態數為所有可能的組合數 O(2n)O(2^n)O(2n), 生成每個狀態所需的時間復雜度近似為 O(1)O(1)O(1), 如`[1] -> [1, 2]`, 故總的時間復雜度近似為 O(2n)O(2^n)O(2n). 使用了臨時空間`list`保存中間結果,`list` 最大長度為數組長度,故空間復雜度近似為 O(n)O(n)O(n). ### Reference - [[NineChap 1.2] Permutation - Woodstock Blog](http://okckd.github.io/blog/2014/06/12/NineChap-Permutation/) - [九章算法 - subsets模板](http://www.jiuzhang.com/solutions/subsets/) - [LeetCode: Subsets 解題報告 - Yu's Garden - 博客園](http://www.cnblogs.com/yuzhangcmu/p/4211815.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看