Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

leetcode59:全排列问题中的used数组问题 #2615

Open
xs-william opened this issue Jul 16, 2024 · 0 comments
Open

leetcode59:全排列问题中的used数组问题 #2615

xs-william opened this issue Jul 16, 2024 · 0 comments

Comments

@xs-william
Copy link

xs-william commented Jul 16, 2024

求问以下代码中的,used用来跳过以及处理过的元素的时候可以利用used[i]的值,这样的话不用排序,只需要利用unordered_set去重即可?但是解答中只有利用used[i-1]结合&&来判断的需要排序。
我的代码和它的相比主要差别在于,我的好像看起来少了一个used[i-1]的判断,所以就感觉我没有去重,但是我又ac了,感觉应该没问题,但是又说不出来很清楚的逻辑,能不能麻烦帮忙解答一下!

个人感觉:和同层去重一样,只是我利用set来去重,不知道这个理解对不对

//利用used[i] + ||
void backtracking(vector<int>& nums, vector<bool>& used) {
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }

        unordered_set<int> uset;
        for (int i = 0; i < nums.size(); i++) {
            //这里的直接使用used[i]的值来跳过可以?我感觉可以,但是解答中只有利用used[i-1]来判断的
            if (uset.find(nums[i]) != uset.end() || used[i] == true) {
                continue;
            }

            uset.insert(nums[i]);
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, used);
            used[i] = false;
            path.pop_back();
        }
    }

//利用used[i-1]结合 &&的
void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
            // used[i - 1] == false,说明同一树层nums[i - 1]使用过
            // 如果同一树层nums[i - 1]使用过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            if (used[i] == false) {
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant