首页 > 其他分享 >力扣-31-下一个排列

力扣-31-下一个排列

时间:2022-12-13 15:57:23浏览次数:40  
标签:排列 end nums int 31 len 力扣 second minBigger

很明显,对于一个排列而言,最后一个位置是动不了的
那么就从倒数第二个位置开始

用递归一点点分析错了几次之后终于自己写出来了(叉腰骄傲)

void nextPermutation(vector<int>& nums) {
	int len = nums.size();
	if (len <2) return;
	// first保存数字,second保存索引
	pair<int, int> minBigger(INT_MAX,-1);
	// 从倒数第二个位置开始找向前找
	for (int i = len - 2; i >= 0; i--) {
		// 从后面的位置中找到一个大于自己且最小的数字
		for (int j = i + 1; j < len; j++) 
			if (nums[j] > nums[i] && nums[j] < minBigger.first) minBigger = { nums[j],j };
		if (minBigger.second != -1) {
			swap(nums[i], nums[minBigger.second]);
			sort(nums.begin() + i + 1, nums.end());
			return;
		}
	}
	sort(nums.begin(), nums.end());
}

符合题意,原地修改,常数额外空间

但是,很明显,双重循环理论上来说时间复杂度不会很好看

这里可以加一个剪枝

		// i+1位置必然是后面序列中的最大元素
		if (nums[i + 1] <= nums[i]) continue;
		else minBigger = { nums[i + 1],i + 1 };
		for (int j = i + 2; j < len; j++) {}

按理来说应该是有优化的…只是我看不出提交有什么效果……

void nextPermutation(vector<int>& nums) {
	int len = nums.size();
	if (len <2) return;
	// first保存数字,second保存索引
	pair<int, int> minBigger;
	// 从倒数第二个位置开始找向前找
	for (int i = len - 2; i >= 0; i--) {
		// 从后面的位置中找到一个大于自己且最小的数字
		// i+1位置必然是后面序列中的最大元素
		if (nums[i + 1] <= nums[i]) continue;
		else minBigger = { nums[i + 1],i + 1 };

		for (int j = i + 2; j < len; j++) 
			if (nums[j] > nums[i] && nums[j] < minBigger.first) minBigger = { nums[j],j };
		if (minBigger.second != -1) {
			swap(nums[i], nums[minBigger.second]);
			sort(nums.begin() + i + 1, nums.end());
			return;
		}
	}
	sort(nums.begin(), nums.end());
}

标签:排列,end,nums,int,31,len,力扣,second,minBigger
From: https://www.cnblogs.com/yaocy/p/16978948.html

相关文章

  • P2431 正妹吃月饼——进制思维题
    正妹吃月饼题目描述今天是中秋节。uim带来了一堆大小不同且味道各异的月饼。这些月饼的质量分别是1g,2g,4g,8g,16g....后面一个是前面的2倍。每种只有一个。uim让正......
  • 力扣-49-字母异位词分组
    字母异位词就是:组成单词的字母相同,只是字母位置不同的单词没什么思路,朴素思路,先全部放到set里,然后不空就取一个出来,回溯构造所有的异位词和set中匹配public:vector<......
  • 力扣每日一题2022.12.12---1832. 判断句子是否为全字母句
    全字母句指包含英语字母表中每个字母至少一次的句子。给你一个仅由小写英文字母组成的字符串sentence,请你判断 sentence是否为全字母句。如果是,返回true;否则,返回......
  • 力扣---746. 使用最小花费爬楼梯
    给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的......
  • struts2 CVE-2013-4316 S2-019 Dynamic method executions Vul
    struts2CVE-2013-4316S2-019DynamicmethodexecutionsVulcatalog1.Description2.EffectedScope3.ExploitAnalysis4.PrincipleOfVulner......
  • 'gbk' codec can't decode byte 0x89 in position 310: illegal multibyte sequence
    'gbk'codeccan'tdecodebyte0x89inposition310:illegalmultibytesequence #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#pipin......
  • 剑指offer84:包含重复元素集合的全排列
    题目:给定一个可包含重复数字的整数集合nums,按任意顺序返回它所有不重复的全排列。1.输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]2.输入:nums=[1,2,3]输出......
  • 力扣---15. 三数之和
    给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和......
  • 20221312 实验七——缓冲区溢出 实验报告
    缓冲区溢出实验指导书内容一、实验简介缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码......
  • 力扣刷题(1)---两数相加
    题目:输入:nums=[2,7,11,15],target=9输出:[0,1]解释:因为nums[0]+nums[1]==9,返回[0,1]。暴力枚举publicstaticint[]twoSum(int[]nums,inttarget)......