[LeetCode] 031. Next Permutation (Medium) (C++/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)

Github: https://github.com/illuz/leetcode


031. Next Permutation (Medium)

链接

题目:https://oj.leetcode.com/problems/next-permutation/

代码(github):https://github.com/illuz/leetcode

题意

求一个序列的下一个排列。

分析

可以用 STL 里的 ‘next_permutation’ 偷懒。

具体算法是:

首先,从最尾端开始往前寻找两个相邻的元素,令第一个元素是 i,第二个元素是 ii,且满足 i<ii

然后,再从最尾端开始往前搜索,找出第一个大于 i 的元素,设其为 j;

然后,将 i 和 j 对调,再将 ii 及其后面的所有元素反转。

代码

C++:

class Solution {
public:
    void nextPermutation(vector<int> &num) {
		if (!num.size())
			return;

		int idx = num.size() - 2;

		// 1. find out the last wrong order
		while (idx >= 0 && num[idx] >= num[idx + 1])
			idx--;

		// 2. swap
		if (idx >= 0) {
			int i = idx + 1;
			while (i < num.size() && num[i] > num[idx])
				i++;
			swap(num[i - 1], num[idx]);
		}

		// 3. reverse
		reverse(num.begin() + idx + 1, num.end());
	}
};

Python:

class Solution:
    # @param num, a list of integer
    # @return nothing (void), do not return anything, modify num in-place instead.
    def nextPermutation(self, num):
        if not len(num):
            return

        idx = len(num) - 2

        # 1. find out the last wrong order
        while idx >= 0 and num[idx] >= num[idx + 1]:
            idx -= 1

        # 2. swap
        if idx >= 0:
            i = idx + 1
            while i < len(num) and num[i] > num[idx]:
                i += 1
            num[i - 1], num[idx] = num[idx], num[i - 1]

        # 3. reverse
        left, right = idx + 1, len(num) - 1
        while left <= right:
            num[left], num[right] = num[right], num[left]
            left += 1
            right -= 1
时间: 2024-12-06 23:36:40

[LeetCode] 031. Next Permutation (Medium) (C++/Python)的相关文章

[array] leetcode - 31. Next Permutation - Medium

leetcode - 31. Next Permutation - Medium descrition 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

[LeetCode] 022. Generate Parentheses (Medium) (C++/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 022.Generate_Parentheses (Medium) 链接: 题目:https://oj.leetcode.com/problems/generate-parentheses/ 代码(github):https://github.com/illuz/leetcode 题意: 产生有 n 对括号的所有有

Java for LeetCode 031 Next Permutation

Next Permutation Total Accepted: 33595 Total Submissions: 134095 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 low

[LeetCode] 039. Combination Sum (Medium) (C++)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 039. Combination Sum (Medium) 链接: 题目:https://leetcode.com/problems/combination-sum/ 代码(github):https://github.com/illuz/leetcode 题意: 给出一些正整数集合,以及一个目标数,从集合中选择一

[LeetCode] 267. Palindrome Permutation II 回文全排列 II

Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form. For example: Given s = "aabb", return ["abba", "baab"]. Given s = "a

leetcode 【 Pascal&#39;s Triangle 】python 实现

题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 代码:oj测试通过 Runtime: 46 ms 1 class Solution: 2 # @return a list of lists of integers 3 def generat

[leetcode]Binary Tree Level Order Traversal @ Python

原题地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal/ 题意:二叉树的层序遍历的实现. 解题思路:二叉树的层序遍历可以用bfs或者dfs来实现.这里使用的dfs实现,代码比较简洁.实际上,二叉树的先序遍历就是dfs实现.   比如一棵树如下: 1 /  \ 2       3 /    \    /   \ 4     5  6    7    二叉树的先序遍历为{1,2,4,5,3,6,7},可以看到这个遍

[leetcode]Search in Rotated Sorted Array @ Python

原题地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/ 题意: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in

[leetcode]Unique Binary Search Trees II @ Python

原题地址:https://oj.leetcode.com/problems/unique-binary-search-trees-ii/ 题意:接上一题,这题要求返回的是所有符合条件的二叉查找树,而上一题要求的是符合条件的二叉查找树的棵数,我们上一题提过,求个数一般思路是动态规划,而枚举的话,我们就考虑dfs了.dfs(start, end)函数返回以start,start+1,...,end为根的二叉查找树. 代码: # Definition for a binary tree node #