99. Permutations

2024-05-12 01:08
文章标签 99 permutations

本文主要是介绍99. 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].

分析:

采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍. 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1]. 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3]. 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3].

/*** 采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍.* 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1].* 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3].* 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3]*/public List<List<Integer>> permute(int[] nums) {List<List<Integer>> list = new ArrayList();List<List<Integer>> tempList = new ArrayList();//临时存储的元素int len = nums.length;if(len<=0){return list;}/*初始化list中只有一个元素的情况*/ArrayList<Integer> list1 = new ArrayList<Integer>();//表示外层list的一个元素list1.add(nums[0]);list.add(list1);/*进入循环从nums[0..i-1]递推出nums[0..i]的排列*/for(int i=1;i<len;i++){int size = list.size();//i-1的时候排列的集合个数,相当于nums = [1,2,3],只排列了前两个时得到的[[1,2][2,1]]的长度for(int j=0;j<size;j++){list1 = (ArrayList<Integer>) list.get(j);//取出i-1的一个集合,相当于取出[[1,2][2,1]]中的[1,2]int size1 = list1.size();for(int k=0;k<=size1;k++){//找nums[i]可以插进去的位置ArrayList<Integer> list2 = new ArrayList<Integer>();list2.addAll(list1.subList(0, k));list2.add(nums[i]);list2.addAll(list1.subList(k, size1));tempList.add(list2);}}/*list首先把之前的元素都清空,然后全部装上最新的元素*/list.clear();list.addAll(tempList);tempList.clear();}return list;}

方法二:

采用全排列的思想做。求全排列的过程就是把数字与其后面的数字相交换的过程。

IList<IList<int>> result = new List<IList<int>>();public IList<IList<int>> Permute(int[] nums){if (nums.Length > 0){Permutation(nums, 0);}return result;}/** nums 表示待排序的字符数组* beginIndex表示开始全排列的下标*/public void Permutation(int[] nums, int beginIndex){int len = nums.Length;/** 说明排序到了最后一个字符,则可以把目前的字符数组转化为字符串加入到最后的结果中* 这也是终止递归的条件。*/if (beginIndex == len - 1){IList<int> list = new List<int>(nums);result.Add(list);return;}/* * 如果当前开始排序的字符不是最后一个字符,则* 1.把这个字符与其后面的所有字符位置相互换;* 2.然后递归为开始全排列的下标为beginIndex+1;* 3.最后要把第一步中交换的两个字符拿回来,保证charArr还是初始的待排序的字符数组。* */else {//index对应的字符表示需要与beginIndex对应的下标交换的字符/* 1.把这个字符与其后面的所有字符位置相互换;*/for (int index = beginIndex; index < len;index++){Swap(nums,beginIndex,index);/*2.然后递归为开始全排列的下标为beginIndex+1;*/Permutation(nums, beginIndex+1);/*3.最后要把第一步中交换的两个字符拿回来,保证nums还是初始的待排序的字符数组。*/Swap(nums,beginIndex,index);}}}private void Swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;} 


这篇关于99. Permutations的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981175

相关文章

图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积

99. 岛屿数量(深搜版) 题目链接:99. 岛屿数量 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 解题思路: 1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都

2024最新发布《2024大模型落地应用案例集》包含国内99个大模型落地应用案例,一次看全!!!

《2024 大模型典型示范应用案例集》是一部具有重要意义和价值的书籍。自 4 月份启动征集以来,得到了社会的广泛关注,共收到申报案例数百个。经专家组的多轮评审,综合考虑案例所属领域、应用需求、创新能力、社会效益、应用前景等多方面因素,进行全面评估,最终遴选出 99 个优秀案例,涵盖 45 个 “行业赋能”、46 个 “智能应用”、8 个 “生态服务”,覆盖新型工业化、能源、医疗、政务等重要应用

LeetCode 46 Permutations + LeetCode 47 Permutations II

题意: 给出一串(46题)不重复or(47题)有重复的数字,要求输出所有排列。 思路: 有没有重复不影响思路 = =。 代码展示为46题提交结果,47题一样过…… 可以偷懒用next_permutation方法也可以自己实现,实现方法为从后往前找第一个出现的nums[i] < nums[i+1],从i后面找出比nums[i]稍大一点的数字nums[x],交换nums[i]和nums[

java99:java 基础备忘

程序 = 算法+数据结构     算法:解决问题的步骤      数据结构:将数据按照某种结构来保存     好的数据结构 => 好的算法 char 可以存储一个中文字符(1个char是两个字节,一个中文字符也是两个字节) && 短路 常用 三目运算 int a = 1; int b = 2; int c = a > b ? c =0101 : c = 1010 boolean ? 1:2

收藏起来!你可以使用Python处理超过99%的文件操作!

你有没有遇到过这样的情况:需要处理文件,但又没有好的工具,或者总觉得Python操作文件太复杂,又或者不知道从哪里开始? 别担心,今天这篇文章将带你轻松掌握Python文件操作的精髓。看完之后,你会发现,其实文件操作一点都不难! 初识文件操作 在我们开始之前,先了解一下什么是文件操作。 文件操作指的是在程序中对文件进行读写、创建、删除等操作。 在Python中,我们主要通过open(

leetcode 99:恢复二叉搜索树

方法一:首先使用中序遍历将所有的节点和节点的值存起来,如果是搜索二叉树节点值的数组应该是升序的,找到不是升序的点,交换节点的值,空间复杂度为O(n) void inorder(TreeNode*root,std::vector<TreeNode*>&list,std::vector<int> &vals){if(root==NULL)return;inorder(root->left,l

leetcode 刷题之路 12 Permutations

Given a collection of 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]. 全排列问题,详细分析参考这篇文章

Leetcode94: Permutations

Given a collection of 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]. 解题思路:字符交换加dfs。 将第

牛客小白月赛99(A-F)

牛客小白月赛99_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A 签到题,不解释 #include<iostream>using namespace std;using ll = long long;int main(){int t; cin >> t;while(t--){ll a, b, x, y; cin >> a >> b >> x >> y

牛客小白月赛99(A~F)

文章目录 写在前面A 材料打印思路code B %%%思路code C 迷宫思路code D 又是一年毕业季思路code E 多米诺骨牌思路code F 自爆机器人思路code 牛客小白月赛99 写在前面 这次的小白月赛题目出的挺好,很多算法知识都有涉及到,E题这种题型我还是第一次遇到,也是学到了一些有用的算法知识 A 材料打印 思路 签到题,考虑2种情况: 彩印比黑