全排列i

重复项数字的所有排列

http://www.nowcoder.com/questionTerminal/4bcf3081067a4d028f95acee3ddcd2b1

两种思路(均基于回溯):

  1. 用数组记录已访问过的元素
  2. 利用交换

利用数组记录已访问过的元素

//
// Created by jt on 2020/8/31.
//
#include <vector>
using namespace std;

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        vector<vector<int> > res;
        dfs(res, vector<int>(), vector<int>(num.size(), 0), num);
        return res;
    }

    void dfs(vector<vector<int> > &res, vector<int> tmp, vector<int> visited, vector<int> &num) {
        if (tmp.size() == num.size()) { res.push_back(tmp); return; }
        for (int i = 0; i < num.size(); ++i) {
            if (visited[i] == 1) continue;
            visited[i] = 1;
            tmp.push_back(num[i]);
            dfs(res, tmp, visited, num);
            tmp.pop_back();
            visited[i] = 0;
        }
    }
};

利用交换

//
// Created by jt on 2020/8/31.
//
#include <vector>
using namespace std;

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        vector<vector<int> > res;
        dfs(res, num, 0);
        return res;
    }

    void dfs(vector<vector<int> > &res, vector<int> &num, int idx) {
        if (idx == num.size() - 1) { res.push_back(num); return; }
        for (int i = idx; i < num.size(); ++i) {
            swap(num[i], num[idx]);
            dfs(res, num, idx+1);
            swap(num[i], num[idx]);
        }
    }
};
刷遍天下无敌手 文章被收录于专栏

秋招刷题历程

全部评论
大佬您好,这个解法好像有点问题,如果是123,最后的结果不是字典序的,321 在312 前面了。
点赞 回复 分享
发布于 2023-03-27 11:50 广东

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
9 收藏 评论
分享
牛客网
牛客企业服务