avatar
permuation sequence 超时# JobHunting - 待字闺中
q*m
1
我先写的那个 next permutation, 然后call 它 k次, 结果超时。
有什么好的方法吗?
谢谢
avatar
l*a
2
那说明你的next permutation没写好
我就这么做的,没超时

【在 q****m 的大作中提到】
: 我先写的那个 next permutation, 然后call 它 k次, 结果超时。
: 有什么好的方法吗?
: 谢谢

avatar
q*m
3
能把你的贴一下吗? 这是我的code.
class Solution {
public:
void nextPermutation(vector &num) {
int i = num.size() - 1;

while(i >= 1 && num[i - 1] >= num[i])
{
--i;
}
if(i == 0)
{
int l = 0, r = num.size() -1 ;
while(l <= r)
{
swap(num[l], num[r]);
++l;
--r;
}
return;
}
int left = i, right = num.size() - 1, target = num[i - 1];
while(left < right)
{
int mid = (left + right) / 2;
if(num[mid] > target)
{
left = mid + 1;
}
else
{
right = mid;
}
}
int tmp = left;
if(num[tmp] <= target)
{
tmp = left - 1;
}
swap(num[i - 1], num[tmp]);
left = i, right = num.size() - 1;
while(left <= right)
{
swap(num[left], num[right]);
++left;
--right;
}
}
string getPermutation(int n, int k) {
vectorv(n, 0);
for(int i = 1; i <= n; ++i)
{
v[i - 1] = i;
}
for(int i = 2; i <= k; ++i)
{
nextPermutation(v);
}
string s;
for(int i = 0; i < n; ++i)
{
s.append(1, v[i] + '0');
}
return s;
}
};

【在 l*****a 的大作中提到】
: 那说明你的next permutation没写好
: 我就这么做的,没超时

avatar
l*a
4
经典算法,查得到吧
扫了一眼,你中间插了一段两分,是想干吗

【在 q****m 的大作中提到】
: 能把你的贴一下吗? 这是我的code.
: class Solution {
: public:
: void nextPermutation(vector &num) {
: int i = num.size() - 1;
:
: while(i >= 1 && num[i - 1] >= num[i])
: {
: --i;
: }

avatar
l*a
5
不是有序的吧?
直接loop就可以啊

exist,
avatar
o*n
6
这道题不需要算permutation.
直接找下一个数. 关键是找出最大位.
比如, 1365 -> 1536, 12837 -> 12873
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。