今天继续刷leetcode,第60题,求全排列的第k个数
分析:
先将全排列求出,然后一次往后数,这样不仅需要空间,而且时间开销也比较大,因此采用找规律的方式求解;
根据n个数的有(n-1)!种排列方式,求k在第几个位置,以及对应的值。
问题:
1、时间开销比较大的时候,考虑找规律;
2、字符串的切片
附上c++代码:
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> t(n,1);
string res;
for(int i=1;i<n;i++)
t[i]=t[i-1]*i;
string s="123456789";
k--;
for(int i=n;i>0;i--)
{
int j=k/t[i-1];
k=k%t[i-1];
res.push_back(s[j]);
s.erase(j,1);
}
return res;
}
};
附上python代码:
class Solution:
def getPermutation(self, n: int, k: int) -> str:
s='123456789'
res=''
t=[1]*n
for i in range(1,n):
t[i]=t[i-1]*i
k-=1
for i in range(n,0,-1):
temp=k//t[i-1]
k=k%t[i-1]
res+=s[temp]
s=s[:temp]+s[temp+1:]
return res