(真)n选m排列算法next_permutation() 非递归版本

C++:全排列函数next_permutation()和prev_permutation() 文章目录前言一、next_permutation()用法二、prev_permutation()用法总结 前言 字节三面,考了leetcode556题,复盘发现了两个超好用的函数,C++STL中的全排列函数为两个:next_permutation和prev_permutation 其中:next_permutation实现升序,而prev_permutation实现降序。 一、next_permutation()用法 二、prev_permutation()用法 总结 学习永无止境! ... 阅读详情
/**
 *@auther 皇阿玛
 *2019/9/16 13:51
 */

package courseOne;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;


class Permutation{//递归方法,要找一个非递归的方法
	int total;
	static int count=0;
//	private int[] people;
	public Permutation(){}
	public Permutation(int total,int SelectPeople){
//		this.people = new int[SelectPeople];
		this.total = total;
	}
	public boolean next(List<Integer> lis,int start){
		if(start >= lis.size() ){
			System.out.println(lis);
			count++;
			return true;
		}
		for(int i=1;i<=total;i++){
			if( !lis.contains(i) ){
				lis.set(start, i);
			}else{
				continue;
			}
			next(lis,start+1);
			lis.set(start, -1);
		}
		return true;
	}
	public boolean next2(List<Integer> lis){//非递归写出来
		int flag = 0;//用来判断初始list是否全为0,则需要赋初值1,2,3...
		int ChangeFlag = 0;//用来判断是否已经对list进行更新了,若已更新,则直接退出并返回true
		for(int i=0;i<lis.size();i++){
			flag += lis.get(i);
		}
		if(flag == 0){//初始化
			for(int j=0;j<lis.size();j++){
				lis.set(j, j); //lis.set(index, element)
			}
			ChangeFlag = 1;
		}else{
			for(int k=lis.size()-1;k>=0;k--){
//				System.out.println("1.k = "+k);/////////////////////////////
				if(!IsMaxOrNot(lis,k) && ChangeFlag == 0){//最后一位不是最大值的话,就进行最小增值
					if( LittleIncrease(lis,k) )
						ChangeFlag = 1;
					//break;
					//若最后一位是最大值,则  k 进入下一层for循环,即把lis中的搜索位置前移
					//若更新的位置k不是最后一位,则需要对k位之后的数据进行从小到大更新!
					if(1 == ChangeFlag ){//如果最小更新的元素位置是k的话=>&& k < lis.size()
//						System.out.println("I'm complemening!!!,k = "+k+" lis = "+lis);
						Complement(lis,k);//对k之后的元素进行按顺序补全
					}
					break;
				}	
			}
		}
		if(1 == ChangeFlag)
			return true;
		else
			return false;
	}
	
	public boolean IsMaxOrNot(List<Integer> lis,int loc){//loc从0开始计数
		int[] tem = new int[total];//初值为0;
		Arrays.fill(tem, 0);	    //对数组用某个数进行填充
		int flag = 1;				//判断标志,默认是最大值,则flag=1,若不是最大值,则令flag=0;
		
		for(int i=0;i<lis.size() && i<loc;i++){//对loc之前&&已用过的 元素进行标记
			tem[lis.get(i)] = 1;
		}
		for(int j=0;j<total;j++){  //未用过的元素中去比较查找是否有更大的元素
			if(tem[j] != 1 && j>lis.get(loc))//数值 j 没用过,而且 j 比lis第loc位的数值要大。
				flag = 0;		   //说明list.get(loc)不是最大值,还有更大的数值可选
		}
		if(0==flag) 
			return false;
		else
			return true;
	}
	public boolean LittleIncrease(List<Integer> lis,int loc){//当某个位置的数值不是最大值时,进行最小限度地增加
		int[] tem = new int[total];//初值为0;
		Arrays.fill(tem, 0);	    //对数组用某个数进行填充
		int flag = 0;				//判断标志,默认是最大值,则flag=1,若不是最大值,则令flag=0;
		
		for(int i=0;i<lis.size() && i<loc;i++){//对loc之前&&已用过的 元素进行标记
			tem[lis.get(i)] = 1;
		}
		for(int j=0;j<total;j++){  //未用过的元素中去比较查找是否有更大的元素
//			System.out.println("2.lis.get(loc) = "+lis.get(loc)+" loc = "+loc);
			if(tem[j] != 1 && j>lis.get(loc)){//数值 j 没用过,而且 j 比lis第loc位的数值要大。
				lis.set(loc, j);   //把loc位置的数值增加为j;!!!!!!!!!!!!
				flag = 1;		   //完成增值工作
//				System.out.println("3.list = "+lis);
				break;
			}
		}
		if(0==flag){
//			System.out.println("false");
			return false;
		}
			
		else{
//			System.out.println("true");
			return true;
		}
			
	}
	public boolean Complement(List<Integer> lis,int loc){//loc是中间更新的位置下标(index) <=> k
		//当处理完的最小增值位置不是在最后一位时,需要对 后面 元素进行补全,按照剩余元素,从小到大处理;当前的 loc 位置  不用改动 !!!!!
		int[] tem = new int[total];//初值为0;
		Arrays.fill(tem, 0);	    //对数组用某个数进行填充
		//int flag = 1;				//判断标志,
//		System.out.println("4.in Complement,loc = "+loc+", lis = "+lis);
		for(int i=0;i<=loc;i++){//对loc之前&&已用过的 元素进行标记(loc就是下标,直接带入index)  :i<lis.size() && 
			tem[lis.get(i)] = 1;				//这里loc要记得取等号
		}
		
		for(int j=loc+1;j<lis.size();j++){//j:每个待修正的位置坐标!!!对loc之后的元素进行重新洗牌,坐标从(loc+1)开始走
			int ChangeFlag = 0;//修补过程,已进行到的 位置 下标!!!
			for(int k=0;k<total && ChangeFlag == 0;k++){
				if(tem[k]!=1){
					lis.set(j, k);
					ChangeFlag = 1;
					//ChangeFlag++;
					tem[k] = 1;
//					System.out.println("5.lis = "+lis+", k = "+k+", loc = "+loc+", Changeflag="+ChangeFlag);
				}
			}
		}
		return true;
	}
	
}


public class PermutationExample {
	public static void main(String[] args){
		
		int sum = 0;
		int total = 5;
		int need = 3;// n <=> SelectPeople
		List<Integer> lis = new ArrayList<Integer>();
		List<String> lis2 = new ArrayList<String>();
//		lis2.add("q");
//		lis2.get(0);
//		System.out.println("ss");
		for(int i = 0 ; i < need;i++) {
			lis.add(0);
		}
		Permutation perm = new Permutation(total,need);
		
		
		while(perm.next2(lis)){
			System.out.println(lis);
			sum++;
		}
		System.out.println("The num of permutations is "+sum+" !!!");
//		while(sum>0){
//			perm.next2(lis);
//			System.out.println(lis);
//			sum--;
//		}
	}
}
		/**
		 * 
		 
		List<Integer> lis = new ArrayList<Integer>();
		for(int i = 0 ; i < need;i++) {
			lis.add(-1);
		}
		
		Permutation per = new Permutation(total,need);
		per.next(lis, 0);
//		int sum = 60;
//		while( sum>0 ){
//			per.next(lis, 0);
//			System.out.println(lis);
//			sum--;
//		}
		System.out.println("all of the number:"+per.count); 
		*/

 

全排列问题算法及实现(Permutation) 前言 做项目遇到数据采集系统中ADC拼合问题,如果顺序不对,波形就是错误的(题外话),为了找到正确的顺序,涉及到排列问题。 什么是排列组合 定义 一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。特别地,当m=n时,这个排列被称作全排列(Permutation)。  Ex:考虑三个数字1,2,3,这个序... 阅读详情

相关推荐

免费搞定DWG转DXF:ODA File Converter保姆级配置指南(附常见报错解决)

本文详细介绍了如何使用ODA File Converter免费工具实现DWG到DXF的格式转换,包括环境配置、命令行参数解析、编程集成方案及常见问题解决。特别针对网络访问异常、参数配置等实际痛点提供应对策略,帮助用户高效完成工程设计文件的格式转换。

weixin_29291185的博客 6037

N个数取m个数的全排列非递归

全排序的非递归实现

lin200753的专栏 4575

eda、gnm、anm究竟是个啥?

eda:主成分分析 gnm:高斯网络模型 anm:各向异性网络模型

药研猿的博客 1243

从N个元素挑出M个组合的算法

1. 将i 从0到(2的N平方-1)递增,依次寻找i的二进制中1的个数,如果为m,则进行后续操作。 2. 递归调用函数: 这个是示例代码(待补充): #include<iostream>using namespace std;const int MAX=10;int g[MAX],N,M;void zuhe(int n,int m){ for (int...

1549

A robust and easy to implement method for IMU calibration without external equipments(IMU标定)

A robust and easy to implement method for IMU calibration without external equipments 1 标定原理1 亲试可用,还有动态演示效果不错。相比商用产品的简易标定流程,该标定方法有以下几点不同: 给出了加速度计和陀螺仪更复杂的模型。 利用Allan方差的定义,标定陀螺仪的偏置。 大量冗余数据,保证最优化收敛。利用数十...

擦擦擦大侠的博客 3948

长鑫存储面试真题解析:DRAM工程师的工程直觉与产线思维

DRAM作为现代计算系统的底层存储基石,其性能与可靠性高度依赖半导体物理基础、工艺窗口控制和电路-系统协同设计。理解电荷保持机制、位线电容耦合效应、信号完整性约束等核心原理,是突破传统数字IC思维、构建真实产线语感的关键。在晶圆厂级工程实践中,TEM缺陷识别、BIST空间聚类分析、Retention失效定位等能力,直接关联良率爬坡与客户系统稳定性。本文聚焦长鑫存储一线技术面试中高频出现的工艺-电路-测试三维问题,融合‘电荷保持’‘信号完整性’等热词,还原DRAM工程师必备的系统性建模能力与闭环验证思维,覆盖

weixin_34293246的博客 337

利用分治思想,写一个求解从n个元素里选取m个有多少种组合方案的(非递归)高性能算法

从一个简单的例子说起,比如现在一个数组[0,1,2,3,4,5,6],要求不重复选取4个,请问有多少种组合。我们按照从小到大的顺序罗列了15种结果:(粗体表示但前指针位置) 组合数 对应的偏移量数组 [0,1,2,3], [0,0,0,0] [0,1,2,4], [0,0,0,1] [0,1,2,5], [0,0

baidu_38487648的博客 1704

独立站SaaS平台源码搭建全流程指南:从零到部署

一、什么是独立站SaaS?二、搭建前的准备工作技术选型建议模块 推荐方案 备选方案前端框架 React/Vue3 + TypeScript Angular后端框架 Spring Boot (Java)/Django (Python) Node.js (NestJS)数据库 MySQL + Redis PostgreSQL/MongoDB云服务 阿里云/腾讯云/AWS 华为云容器化 Docker + Kubernetes Docker Compose环境要求。

Vx18664956126的博客 1892

从n个数中选取m个数的所有组合

非递归实现: #include #define N 7 #define M 3 int main() { int array[N] = { 1,2,3,4,5,6 ,7 }; int i, j, k; for (i = 0; i<=N-M; i++) for (j = i + 1; j<=N-M+1; j++) for (k = j + 1; k<=N-M+2;

microlyc的博客 2万+

微信小程序 - 下单账号和支付账号不一致,请核实后再支付(微信小程序或微信H5页面/微信公众号网页支付时报错:“下单账号和支付账号不一致,请核实后再支付”,买家微信支付时提示错误)详细排查和解决方案!

微信支付出现 “下单账号与支付账号不一致,请核实后再支付”微信小程序下单账号与支付账号不一致不让支付,微信公众号网页 微信H5页面JS-SDK支付时出现错误:下单账号和支付账号不一致,请核实后再支付,openId导致的微信中“下单账号和支付账号不一致”原因及解决办法,调用统一下单所传openId与实际支付用户的openId不一致,微信支付jssdk报错,检查了没有不一致依然报错怎么办,微信支付下单账号和支付账号不一致,请核实后再支付,微信支付功能用JSAPI支付,H5页面负责下单并支付jsapi,微信调起支

🏆 前端领域优质创作者 5334

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

c++全排列 next_permutation()函数

c++全排列 转载博客:https://www.cnblogs.com/cstdio1/p/11311500.html 对于next_permutation函数,其函数原型为: #include < algorithm> bool next_permutation(iterator start,iterator end) 当当前序列不存在下一个排列时,函数返回false,否则返回tru...

zlzhujust@gmail.com 3392

2026软考中级-软件设计师笔记(送最新视频教程)

核心口诀:运控存输输(运算器、控制器、存储器、输入、输出)例题(2019年上半年):核心公式:数字签名流程:数字证书作用:死锁4个必要条件:死锁判断公式:处理策略:程序设计语言的四大核心成分:顺序表操作(时间复杂度):链表操作(时间复杂度):核心思想:频率高的字符用短编码,频率低的用长编码 → 最小化总编码长度构造步骤(贪心算法):前提:有序表(升序/降序) 步骤:时间复杂度:O(log₂n) 例:查找中核心思想:用哈希函数将关键字映射到存储位置 哈希冲突:不同关键字映射到同一位置 → 用链地址法或开放定址

36万+

Wand-Enhancer 免费解锁 WeMod 专业版:三步本地补丁完整指南

WeMod 的专业功能都锁在订阅后面,不想按月付费?Wand-Enhancer 是一个开源本地补丁工具,全程离线改写 WeMod 客户端文件,免费完整解锁专业版,零网络请求、零成本。 ## 先说做完能拿到什么 跑通之后,你的 WeMod 账号会直接显示专业版(年费、已激活):原本受限的修改器库全部开放,实时修改与快捷键正常生效,主题与本地增强布局可选应用。如果打上了远程面板补丁,手机扫码同一局

gitblog_00109的博客 960

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

next_permutation函数简要

next_permutation函数 文章目录next_permutation函数前言一、int 类型的next_permutation二、char 类型的next_permutation三,例题总结 前言 输入一个序列,每调用一次,可以求出输入序列的下一个序列,可以遍历全排列,要包含头文件 与之完全相反的函数还有prev_permutation 一、int 类型的next_permutation 代码如下(示例): int main(){ int a[3]; a[0]=1;a[1]=2;

weixin_53518090的博客 3881

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

全排列生成算法:next_permutation

转自: http://www.cnblogs.com/devymex/archive/2010/08/17/1801122.html欢迎看原博客!概念全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列。本文将详细的介绍prev_p

好记性不如烂笔头的专栏 582

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STL求下一个全排列算法 next_permutation

next_permutation STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。 next_permutation通常用于生成序列的全排列。 用法 int a[] = {1, 2, 3} do{ cout << a[0] << " " << a[1] << " " << a[2] << endl; }while(next_permutatio

m0_61506053的博客 797

全排列next_permutation(c,c+a)

Ignatius and the Princess IITime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9858    Accepted Submission(s): 5760Problem Description Now our hero...

henucm的博客 488

N个数全排列的第M个排列是?(全排列)

给你N个整数,分别是1,2,3,。。。N。问你全排列的第M个排列为多少? Input 输入包含几个测试用例。每个测试用例由两个数字组成,N和M(1<=N<=1000, 1<=M<=10000). 你可能会假设总有一个序列满足题目需求。输入在文件结束时终止。 Output 对于每个测试用例,您只需要输出满足题目要求的序列。输出序列时,应该在两个数字之间打印空格,但不要...

weixin_44373494的博客 2206

STL之全排列函数 next_permutation

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止 prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反 解决问题: eg: 1.给定非空序列,生成递增或递减序列 2.从n个数中选择m个数,按字典序输出其排...

点点滴滴 332

hdu1027(n个数的按字典序排列的第m个序列)

题目信息:给出n,m,求n个数的按字典序排列的第m个序列 http://acm.hdu.edu.cn/showproblem.php?pid=1027 AC代码: /**  *全排列的个数(次序)  */ #include #include #include int a[1001],x; using namespace std; void print(int n)

机器笨猫 6091

全排列next_permutation函数

POJ1833 全排列问题 查看题目点击此链接 分析: 此问题用到next_permutation函数则很容易 next_permutation函数是求当前排列的下一个排列 next_permutation(a,a+n);//求下一个排列 prev_permutation(a,a+n);//求上一个排列 //如果没有上一个排列或下一个排列则返回false,否则true //还可以定义cmp来定义排列的方式next_permutation(a,a+n,cmp) 知道了这个函数那么题目就简单了很多 inclu

wzy1414的博客 298

全排列的生成使用C++的库函数:next_permutation

全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。但C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列。本文将详细的介绍prev_permutation函数的内部算法。

Follow My Heart 2896

【ACM】与全排列相关的STL函数 prev_permutation next_permutation

排列  与  全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。 当m=n时所有的排列情况叫全排列。如果这组数有n个,那么全排列数为n!个。 对于全排列的求解可以使用递归,这里介绍几个方便的函数(),得到全排列。 对于序列{ 'a' , 'b' , 'c' }(之后为了方便,不打单引号,嘻嘻),每一个元素都比后面的小,按照字...

( :3 ) 418

next_permutation

next_permutation(): 求“下一个”排列组合 例如 三个字符{a, b, c}组成的序列, next_permutation()能按字典序返回6个组合: abc,acb,bac,bca,cab,cba 函数next_permutation()的定义有两种形式: bool next_permutation (BidirectionalIterator first, Bi...

chen_zan_yu_的博客 199
上一篇: kmeas算法,最菜学法,一点一点注释学习
下一篇: n选m 组合 算法的next函数(非递归方法)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值