首页 > 其他 > 详细

[Lintcode]18. Subsets II/[Leetcode]90. Subsets II

时间:2019-02-16 00:53:34      阅读:237      评论:0      收藏:0      [点我收藏+]

18. Subsets II/90. Subsets II

  • 本题难度: Medium
  • Topic: Search & Recursion

Description

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Example
Example 1:

Input: [0]
Output:
[
[],
[0]]
Example 2:

Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]]
Challenge
Can you do it in both recursively and iteratively?

Notice
Each element in a subset must be in non-descending order.
The ordering between two subsets is free.
The solution set must not contain duplicate subsets.

我的代码

    def subsetsWithDup(self, nums):
        # write your code here
        # no recursion
        if len(nums) == 0:
            return [[]]
        nums.sort()
        pre1 = [[]]
        pre2 = [[nums[0]]]
        preitem = nums[0]
        for index in range(1, len(nums)):
    
            if nums[index] == preitem:
                pre1 = pre1 + pre2
                pre2 = [i + [nums[index] ] for i in pre2]
            else:
                pre1 = pre1 + pre2
                pre2 = [i + [nums[index] ] for i in pre1]
            preitem = nums[index]
        return pre1 + pre2

别人的代码

Recursion

    def subsetsWithDup(self, nums):
        res = []
        nums.sort()
        self.dfs(nums, 0, [], res)
        return res

    def dfs(self, nums, index, path, res):
        res.append(path)
        for i in range(index, len(nums)):
            if i > index and nums[i] == nums[i-1]:
                continue
            self.dfs(nums, i+1, path+[nums[i]], res)

改进的非Recursion

class Solution:
    # @param num, a list of integer
    # @return a list of lists of integer
    def subsetsWithDup(self, S):
        res = [[]]
        S.sort()
        for i in range(len(S)):
            if i == 0 or S[i] != S[i - 1]:
                l = len(res)
            for j in range(len(res) - l, len(res)):
                res.append(res[j] + [S[i]])
        return res

除去了额外的存储空间

思路

非循环

  1. 不存在重复元素:f(n) = 2*f(n-1)
  2. 存在重复元素的: (1,2,2‘)中(1,2)/(1,2‘),(2)/(2‘)是重复的,它们去掉该k个重复元素的f(n-k)
  3. []
    1 . [] pre1 /[1] pre2
  4. [] [1] pre1 /[2] [1,2] pre2
    2‘. [] [1] [2], [1,2] pre1/ [2,2],[1,2,2] pre2
    2‘ [] [1] [2], [1,2] [2,2],[1,2,2] pre1 /[2,2,2] [1,2,2,2] pre2

循环

DFS
[1,2,2]为例子,

技术分享图片

  • 时间复杂度 O(2^n)

[Lintcode]18. Subsets II/[Leetcode]90. Subsets II

原文:https://www.cnblogs.com/siriusli/p/10386556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!