`
frank-liu
  • 浏览: 1682453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Permutations

 
阅读更多

问题描述:

Given a collection of distinct numbers, return all possible permutations.

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

原问题链接:https://leetcode.com/problems/permutations/

 

问题分析

  这个问题可以归结为典型的排列问题。在之前的一篇文章里有过详细的讨论。 在前面的文章里,我们提到的字典序排列的方法就可以很好的解决这个问题。在每次生成字典序的排列最后我们将这个序列加入到List里面,这样就可以得到所有的排列生成列表。

  而字典序排列的过程概括起来就是如下这么个步骤:

  1. 找最后面的连续递增点。
  2. 根据找到的点后面找最接近的大于它的元素。
  3. 倒置后面序列里的元素。

  详细实现见如下代码:

 

public class Solution {
    public List<List<Integer>> permute(int[] num) {
        Arrays.sort(num);
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        lists.add(appendList(num));
        while(true) {
            int start = findStart(num);
            if(start == -1) break;
            int end = findEnd(num, start);
            if(end == -1) break;
            swap(num, start, end);
            reverse(num, start + 1, num.length - 1);
            lists.add(appendList(num));
        }
        return lists;
    }
    
    private List<Integer> appendList(int[] num) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0; i < num.length; i++)
            list.add(num[i]);
        return list;
    }
    
    private int findStart(int[] num) {
        for(int i = num.length - 2; i >= 0; i--)
            if(num[i] < num[i + 1])
                return i;
        return -1;
    }
    
    private int findEnd(int[] num, int l) {
        for(int i = num.length - 1; i > l; i--)
            if(num[i] > num[l])
                return i;
        return -1;
    }
    
    private void reverse(int[] num, int l, int r) {
        while(l < r) {
            swap(num, l, r);
            l++;
            r--;
        }
    }
    
    private void swap(int[] num, int i, int j) {
        int temp = num[i];
        num[i] = num[j];
        num[j] = temp;
    }
}

 

分享到:
评论

相关推荐

    leetcode:LeetCode解决方案

    6. **回溯**:如“全排列”(Permutations),使用回溯算法找出所有可能的排列组合。 在阅读和学习这些解决方案时,你可以深入了解每种数据结构和算法的工作原理,并学习如何在 TypeScript 中有效地实现它们。同时...

    leetcode最大连通域-leetcode:leetcode

    permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的三元组,其总和为零。 first_last_pos_array.py - 找到给定目标值的开始和结束...

    leetcode:我的leetcode解决方案

    例如,`itertools.permutations()`和`itertools.combinations()`可以高效地生成排列和组合。 最后,Python的`unittest`模块是进行单元测试的好工具,可以在本地验证LeetCode问题的解决方案是否正确。通过编写测试...

    LeetCode:LeetCode上一些算法的解答

    6. **回溯**:回溯是一种尝试所有可能解的算法策略,常见于解决组合优化问题,如"全排列"(Permutations)和"N皇后问题"(N-Queens)。 7. **动态规划**:动态规划是一种解决最优化问题的方法,通过构建状态转移...

    2sumleetcode-LeetCode:力码

    leetcode 轮廓 1_count_and_say.cpp - super_ugly_number.cpp - Detect_Pattern.cpp - degree_of_array.cpp - 键盘.cpp - 2Sum_Data_Structure_Design.cpp - shuffle_array.cpp - permutations.cpp - kth_missing_...

    leetcode:LeetCode练习

    6. **回溯法**:如“全排列”(Permutations),要求列出所有可能的数组排列。 7. **堆和队列**:如“最小覆盖子集”(Minimum Size Subarray Sum),需要找到使数组元素和大于等于给定目标的最小子数组长度。 每个...

    leetcode双人赛-Leetcode:leetcode中问题的解答

    permutations import random import itertools import collections from fractions import Fraction from collections import Counter import operator import re from functools import reduce from collections ...

    leetcode:leetcode每日一题

    例如,`itertools`模块中的`combinations`和`permutations`可以帮助我们进行组合和排列的计算;`heapq`模块则提供了优先队列,对于解决最小堆问题十分便捷。 在LeetCode中,Python的内置函数如`map`、`filter`、`...

    leetcode分类-LeetCode:LeetCode在线裁判C++

    Permutations (交换 取子集两种方式) Trie树 11 中序遍历 无堆栈 (前序 后序) 12 map边删除 边输出 不太建议这么用。。。 以及其他基本用法 iterate 红黑树 13.set 16.unordered_map 与 map 17.最大m字段和 (动态...

    LeetCode:地里刨食的野猪

    3. **Python标准库**:如`collections`中的`deque`(双端队列)可用于BFS,`itertools`中的`combinations`或`permutations`可以用于生成所有可能的解决方案。此外,`heapq`模块可用于优先队列,这对于解决某些优化...

    leetcode:我对Leetcode问题的解决方案的集合

    8. **回溯**:回溯法常用于解决排列组合问题,如"全排列"(Permutations),需要生成所有可能的排列组合。 9. **动态规划**:动态规划是解决复杂问题的有效方法,如"背包问题"(Knapsack Problem),通过状态转移...

    leetcode怎么计算空间复杂度是指-LeetCode-Solution:我的第一个LeetCode解决方案

    leetcode怎么计算空间复杂度是指 LeetCode-Solution my first solution of LeetCode 2015-5-7 Problem 95,98(80 already!) 我经常在递归的结束地方忘记return!!! 题型一:经典暴力递归:(里面涉及到重复不重复的...

    leetcode2-leetcode2:leetcode2

    - 使用`itertools`模块提供的工具函数,如`combinations()`, `permutations()`等,处理组合和排列问题。 - 应用动态规划、贪心算法、回溯法等算法思想,解决复杂问题。 4. **'leetcode2-master'项目**: - '...

    LeetCode Permutation

    Source file for LeetCode Permutations Problem

    C语言-leetcode题解之46-permutations.c

    c语言入门 C语言_leetcode题解之46-permutations.c

    js-leetcode题解之46-permutations.js

    js js_leetcode题解之46-permutations.js

    leetcode 46. Permutations 迭代+递归 python3

    LeetCode第46题,题目要求根据给定的整数集合,返回所有可能的排列组合。这个问题属于组合数学与算法设计的范畴,主要考察的是全排列的生成。 【解题思路】 1. **递归算法**:递归方法是从剩余未使用的元素中选择...

    C语言-leetcode题解之47-permutations-ii.c

    c语言入门 C语言_leetcode题解之47-permutations-ii.c

    js-leetcode题解之47-permutations-ii.js

    js js_leetcode题解之47-permutations-ii.js

Global site tag (gtag.js) - Google Analytics