【力扣每日一题:90、子集Ⅱ】判断ArrayList集合中的元素是否全部相同

写在前面

是这样的,今天的力扣题求数组子集,但是要求不能有重复的,我想的难道要暴力比较?但是又想了一下,实现的可能性很小,因为子集中元素的个数也是个问题。直接用本方法吧。

笨方法

原本上网搜了一下,说用List中的retainAll方法,但是这个行不通,retainAll方法是如果有包含的元素全部相同就返回false,否则返回true,但是无法解决个数的问题,所以后来我想的很简单,直接sort然后equlas就行,两个集合sort之后可以直接equals判断了。这里代码就不写了。

用set去重

class Solution {
    
    
    public List<List<Integer>> subsetsWithDup(int[] nums) {
    
    
        Arrays.sort(nums);
        Set<List<Integer>> ans = new HashSet<>();
        List<Integer> cur = new ArrayList<>();
        dfs(nums, 0, cur, ans);
        return new ArrayList<>(ans);
    }

    /**
     * @param nums 原输入数组
     * @param u 当前决策到原输入数组中的哪一位
     * @param cur 当前方案
     * @param ans 最终结果集
     */
    void dfs(int[] nums, int u, List<Integer> cur, Set<List<Integer>> ans) {
    
    
        // 所有位置都决策完成,将当前方案放入结果集
        if (nums.length == u) {
    
    
            ans.add(new ArrayList<>(cur));
            return;
        }

        // 选择当前位置的元素,往下决策
        cur.add(nums[u]);
        dfs(nums, u + 1, cur, ans);

        // 不选当前位置的元素(回溯),往下决策
        cur.remove(cur.size() - 1);
        dfs(nums, u + 1, cur, ans);
    }
}

作者:AC_OIer
链接:https://leetcode-cn.com/problems/subsets-ii/solution/gong-shui-san-xie-yi-ti-shuang-jie-hui-s-g77q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

看了看大佬的题解,又学到了许多东西。原来Set可以直接去重,省的sort浪费时间了。而且可以把集合放到构造函数中,十分方便。
我的方法用时20ms,大佬的5ms。

猜你喜欢

转载自blog.csdn.net/VanGotoBilibili/article/details/115345800