【第29天】掌握用Set和used数组去重的区别!

文章介绍了如何利用回溯算法和Set数据结构来解决两种数组排列问题:非递减子序列查找和不重复排列。在非递减子序列问题中,Set用于去重;在Permutations和PermutationsII题目中,除了回溯和used数组处理重复,PermutationsII还额外使用Set避免重复的子序列。
  1. Non-decreasing Subsequences

这题用Set去重即可。我觉得set真的很好用,应该优先考虑set,其次是used数组。

class Solution {
    private List<List<Integer>> res = new ArrayList<>();
    private List<Integer> tmp = new ArrayList<>();

    private void backtracking(int[] nums, int start){
        if(start == nums.length) return;

        Set<Integer> set = new HashSet<>();
        for(int i = start; i < nums.length; ++i){
            if(isLarger(tmp, nums[i]) && set.add(nums[i])){
                tmp.add(nums[i]);
                if(tmp.size() > 1) res.add(new ArrayList(tmp));
                backtracking(nums, i+1);
                tmp.remove(tmp.size()-1);
            }
        }
    }


    private boolean isLarger(List<Integer> tmp, int num){
        if(tmp.size() == 0) return true;
        return tmp.get(tmp.size()-1) <= num;
    }

    public List<List<Integer>> findSubsequences(int[] nums) {
        backtracking(nums, 0);
        return res;
    }
}
  1. Permutations

这题思路比较巧妙。

思路:

  1. 因为要“往回”加元素,所以循环条件必须每次是i = 0.
  2. 那么怎么记录重复加进去的元素?得用used数组。
  3. 在当个元素标记使用过,后面就知道,不会在加进去相同元素了。
class Solution {
    private List<List<Integer>> res = new ArrayList<>();
    private List<Integer> tmp = new ArrayList<>();

    private void backtracking(int[] nums, boolean[] used){
        if(tmp.size() == nums.length){
            res.add(new ArrayList(tmp));
            return;
        }

        for(int i = 0; i < nums.length; ++i){
            if(used[i]) continue;
            used[i] = true;
            tmp.add(nums[i]);
            backtracking(nums, used);
            tmp.remove(tmp.size()-1);
            used[i] = false;
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        boolean[] used = new boolean[nums.length];
        Arrays.fill(used, false);
        backtracking(nums, used);
        return res;
    }
}
  1. Permutations II

有了上一题,这题并不难想。就是多一个用Set去重。

Set可以去“重复树枝”的重!如果1-1-2已经存在, 下次1-1就会被Set阻止!

class Solution {
    private List<List<Integer>> res = new ArrayList<>();
    private List<Integer> tmp = new ArrayList<>();

    private void backtracking(int[] nums, boolean[] used){
        if(tmp.size() == nums.length){
            res.add(new ArrayList(tmp));
            return;
        }

        Set<Integer> set = new HashSet<>();

        for(int i = 0; i < nums.length; ++i){
            if(used[i]) continue;
            if(set.add(nums[i])){
                tmp.add(nums[i]);
                used[i] = true;
                backtracking(nums, used);
                tmp.remove(tmp.size()-1);
                used[i] = false;
            }
        }
    }

    public List<List<Integer>> permuteUnique(int[] nums) {
        boolean[] used = new boolean[nums.length];
        Arrays.fill(used, false);
        Arrays.sort(nums);
        backtracking(nums, used);
        return res;
    }
}
local data_dirs=("/sys", "/data", "/home") # 数据盘常见路径 local seen_mounts=() local result_json="[]" # 子函数:添加挂载点信息 add_mount_info() { local path=$1 [[ ! -d "$path" ]] && return # 获取所在挂载点 local mount_point mount_point=$(df -P "$path" 2>/dev/null | tail -n1 | awk '{print $6}') [[ -z "$mount_point" ]] && return # for m in "${seen_mounts[@]}"; do [[ "$m" == "$mount_point" ]] && return done seen_mounts+=("$mount_point") # 提取 df 数据 local line line=$(df -P "$path" | tail -n1) local size_kb=$(echo "$line" | awk '{print $2}') local used_kb=$(echo "$line" | awk '{print $3}') local avail_kb=$(echo "$line" | awk '{print $4}') local usage_pc=$(echo "$line" | awk '{print $5}' | tr -d '%') # local total_gb=$(awk "BEGIN {printf \"%.6f\", $size_kb / 1024 / 1024}") # local used_gb=$(awk "BEGIN {printf \"%.6f\", $used_kb / 1024 / 1024}") # local used_gb=$(awk "BEGIN {printf \"%.6f\", $used_kb / 1024 / 1024}") local disk_type="data" [[ "$mount_point" == "/" ]] && disk_type="system" # 使用 jq 安全地追加新对象到 result_json 数组 result_json=$(jq -r --arg mp "$mount_point" \ --arg dt "$disk_type" \ --arg tg "$size_kb" \ --arg ug "$used_kb" \ --arg ag "$avail_kb" \ --arg pc "$usage_pc" \ ' . + [{ mount_point: $mp, type: $dt, total: ($tg), used: ($ug), available: ($ag), usage_percent: ($pc | tonumber) }] ' <<< "$result_json") } # 添加根分区 add_mount_info "/" # 添加数据目录对应挂载点 for dir in "${data_dirs[@]}"; do echo $dir add_mount_info "$dir" done echo $result_json 这个打印出来为啥只有一条数据
11-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值