LetCode 60. 第k个排列

static int x=[](){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}();
class Solution {
public:
    string getPermutation(int n, int k) {
	    string s;
	    k--;
	    vector<int> arr(n + 1, 1);
	    vector<int> num(n + 1, 0);
	    for (int i = 1; i <= n; i++)
		    arr[i] = i * arr[i - 1];
        // 每次确定一个数
	    for (int i = n; i >= 1; i--) {
		    if (s.length() == n - 1) {
			    int index = 1;
			    while (num[index]) index++;
			    s.push_back(index + 48);
			    break;
		    }
		    int tmp = k / arr[i - 1] + 1;
		    k %= arr[i - 1];
		    int cnt = 0;
		    for (int i = 1; i < n + 1; i++) {
			    if (num[i] == 0)
				    cnt++;
			    if (cnt == tmp) {
				    s.push_back(i + 48);
				    num[i] = 1;
				    break;
			    }
		    }
	    }
	    return s;
    }
};

猜你喜欢

转载自blog.csdn.net/wbb1997/article/details/81003131