Title:

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

思路:

联想实际操作,一般都是从最后一位开始分析。就会发现实际上我们需要找的就是从末尾开始,一直保持逆序的位置。比如1,4,3,2中后面的4,3,2都是逆序,因此需要替换1,找到1后面的稍微比它大的数。大致思路就是这样。

class Solution {
public:
void nextPermutation(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int nSize = num.size();
if (nSize <= ) return; int idx = nSize - ;
// 查找第一个下降的元素
while(--idx >= && num[idx] >= num[idx+]);
if (idx >= )
{
int i = nSize - ;
// 查找第一个比idx所指元素大的元素
while(num[i] <= num[idx])
{
--i;
}
swap(num[i], num[idx]);
// 反转后面所有元素,让它从小到大sorted
reverse(num.begin()+idx+, num.end());
}
else
{
reverse(num.begin(), num.end());
}
}
};

查找可用二分查找,虽然最后的时间都差不多

class Solution {
public:
void swap(int &i, int& j){
i = i+j;
j=i-j;
i=i-j;
} int find(vector<int> &num, int startIndex, int v){
int l = startIndex;
int h = num.size()-;
while (l <= h){
int m = (l+h)/;
if (num[m] > v){
l = m+;
}else{
h = m-;
}
}
return h;
}
void nextPermutation(vector<int> &num) {
if (num.size() <= )
return ;
int index = num.size()-;
int min;
int l,r;
while ( index > && num[index-] >= num[index]){
index--;
}
//cout<<index<<endl;
if (index == ){
//到头
l = ;
r = num.size()-;
while (l < r){
swap(num[l],num[r]);
l++;
r--;
}
}else{
//从后面的序列中找到比当前的数刚好大得那个数,并交换,然后重新从小到大排序
int temp = find(num,index,num[index-]);
//cout<<"temp: "<<temp<<endl;
swap(num[index-],num[temp]);
//sort(num.begin()+index,num.end());
l = index;
r = num.size()-;
while (l < r){
swap(num[l],num[r]);
l++;
r--;
}
}
}
};

Title:

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].

思路,DFS搜索

void internalpermuteUnique(vector<int> &num, int index, vector<int> &perm, vector<vector<int> > &result) {
int size = num.size(); if (size == index) {
result.push_back(perm);
}
else {
for (int i = index; i < size; ++i) {
if ((i > index) && (num[i] == num[index])) {
continue;
}
else {
swap(num[index], num[i]);
} perm.push_back(num[index]);
internalpermuteUnique(num, index + , perm, result);
perm.pop_back();
swap(num[index], num[i]);
}
//sort(num.begin() + index, num.end());
}
} vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > result;
vector<int> perm; sort(num.begin(), num.end());
internalpermuteUnique(num, , perm, result); return result;
} Title: Permutation Sequence

The set [1,2,3,…,n] contains a total of n! unique permutations.


By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):


  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"


Given n and k, return the kth permutation sequence.

思路:题目不难,通过演算就可以找到规律,不过要注意下标,是从0开始的。所以最开始要将k--

 
class Solution{
public:
string getPermutation(int n,int k){
vector<int> v;
string result;
if (k <= )
return result;
if ( n < || n > )
return result;
for (int i = ; i <= n; i++)
v.push_back(i);
k--;
while (n > ){
int c = getFactorial(--n);
int a = k / c;
int b = k % c;
result.push_back(v[a]+'');
v.erase(v.begin()+a);
k = b;
}
result.push_back(v[]+'');
return result;
}
int getFactorial(int k){
if (k == )
return ;
else
return k * getFactorial(k-);
}
};

 

LeetCode: Next Permutation & Permutations1,2的更多相关文章

  1. LeetCode:60. Permutation Sequence,n全排列的第k个子列

    LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...

  2. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  3. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  4. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  5. LeetCode Palindrome Permutation II

    原题链接在这里:https://leetcode.com/problems/palindrome-permutation-ii/ 题目: Given a string s, return all th ...

  6. LeetCode Palindrome Permutation

    原题链接在这里:https://leetcode.com/problems/palindrome-permutation/ 题目: Given a string, determine if a per ...

  7. Java for LeetCode 060 Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. [LeetCode] Find Permutation 找全排列

    By now, you are given a secret signature consisting of character 'D' and 'I'. 'D' represents a decre ...

  9. [leetcode]Next Permutation @ Python

    原题地址:https://oj.leetcode.com/problems/next-permutation/ 题意: Implement next permutation, which rearra ...

随机推荐

  1. [转载]C#获取本机IPv4地址

    C#获取本机IP地址在C#1.0之后都使用下面的这种形式: IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipa=i ...

  2. PV操作,

    P操作是先做减一操作,然后判读是否大于等于0. V操作是先做加一操作,然后判断是否大于0

  3. What are Scopes?

    scope is an object that refers to the application model. It is an execution context for expressions. ...

  4. POJ 3126 Prime Path(BFS求“最短路”)

    题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...

  5. grunt安装失败处理

    1.官网 Grunt官网 http://gruntjs.com 2.前言 前段时间一不小心升级了win10(万恶的360),各种不适应各种问题各种软件bug,最终决定回退到win7,然后悲催的发现系统 ...

  6. map的详细用法

     map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  7. 252. Meeting Rooms

    题目: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] ...

  8. python流程控制语句 ifelse - 2

    #! /usr/bin/python x = input('please input a integer:') x = int (x) ): print('你输入了一个负数') else: print ...

  9. jQuery--隐藏事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. VS2015中快捷注释代码块

    注释ctrl+k   ctrl+c 反注释ctrl+k ctrl+u 需要注意的是第二个ctrl不能省略的