LinkCode 下一个排列、上一个排列
http://www.lintcode.com/zh-cn/problem/next-permutation-ii/#
原题
给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。
如果没有下一个排列,则输出字典序最小的序列。
样例
左边是原始排列,右边是对应的下一个排列。
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1
解题思路(示例:[1,3,5,4,2])
- 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也就是3元素的索引指针)
- 接着从3元素后面的列表中[5,4,2]中找到一个比3大的最小元素,将3与其交换后得到([1,4,……])
- 将其后面的列表按照从小到大排序即得到下一个排列([1,4,2,3,5])
代码实现
class Solution:
# @param nums: a list of integer
# @return: return nothing (void), do not return anything, modify nums in-place instead
def nextPermutation(self, nums):
# write your code here
change_index = -1
# 找到需要变换的比后一个数字小的数
for i in xrange(len(nums)-1, 0, -1):
if nums[i] > nums[i-1]:
change_index = i-1
break
if change_index == -1:
nums.reverse()
return nums
min_nums_index = change_index+1
# 找到后面列表中比change_index元素大的最小值
for j in xrange(change_index+1, len(nums)):
if(nums[j]>nums[change_index]) and (nums[min_nums_index]>nums[j]):
min_nums_index = j
# 交换元素
nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
# 排序后面的列表
back = sorted(nums[change_index+1:])
nums[change_index+1:] = back
return nums
上一个排列
是上一题的逆思路,这里就直接上代码啦
class Solution:
# @param num : a list of integer
# @return : a list of integer
def previousPermuation(self, nums):
# write your code here
change_index = -1
# 找到需要变换的比后一个数字大的数
for i in xrange(len(nums)-1, 0, -1):
if nums[i] < nums[i-1]:
change_index = i-1
break
if change_index == -1:
nums.reverse()
return nums
min_nums_index = change_index+1
# 找到后面列表中比change_index元素小的最大值
for j in xrange(change_index+1, len(nums)):
if(nums[j]<nums[change_index]) and (nums[min_nums_index]<nums[j]):
min_nums_index = j
# 交换元素
nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
# 排序后面的列表,降序
back = sorted(nums[change_index+1:],reverse=True)
nums[change_index+1:] = back
return nums
LinkCode 下一个排列、上一个排列的更多相关文章
- select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表
好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...
- Codeforces Round #549 (Div. 2) E 倍增处理按排列顺序的上一个位置
https://codeforces.com/contest/1143/problem/E 题意 p为n的一个排列,给出有m个数字的数组a,q次询问,每次询问a数组区间[l,r]中是否存在子序列为p的 ...
- lintcode:previous permutation上一个排列
题目 上一个排列 给定一个整数数组来表示排列,找出其上一个排列. 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1] 注意 ...
- 算法笔记(c++)--使用一个辅助栈排列另一个栈
算法笔记(c++)--使用一个辅助栈排列另一个栈 仅仅使用一个辅助栈,不使用其他数据结构来排列一个栈,要求,上大下小. 分析下.肯定是先吧主栈中的数据都放到辅助栈中,在辅助栈中上小下大. 1.首先循环 ...
- HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解
目录 题意: 解析 原题描述 字典树动态求Mex @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\ ...
- Javascript JQuery获取当前元素的兄弟元素/上一个/下一个元素(转)
var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; //获得s的下一个 ...
- jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器
1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...
- js获取上一个月、下一个月格式为yyyy-mm-dd的日期
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- 细雨学习笔记:Jmeter上一个请求的结果作为下一个请求的参数--使用正则提取器
Jmeter接口自动化--使用正则提取器,可以把上一个请求的结果取出来,作为下一个请求的入参
随机推荐
- CoreGraphics--画线/圆/矩形
- (void)drawRect:(CGRect)rect { // Drawing code NSLog(@"drawRect自动调用"); //画图步骤 //获取上下文(/画笔 ...
- javascript解析机制、闭包详解
js解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字: 2.用var定义的变量的名 ...
- VC++中解决“在查找预编译头使用时跳过”的方法
Visual C++ Concepts: Building a C/C++ ProgramCompiler Warning (level 1) C4627Error Message": sk ...
- NOI全国赛(2001)--食物链
今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...
- java设计模式(1)
设计模式定义 设计模式原则 设计模式分类 常用设计模式 (一)设计模式定义 设计模式是针对软件设计中普遍存在的各种问题,所提出的解决方案. 换句话说,设计模式是一套被反复使用,多数人知晓的.经过分类的 ...
- 【Yii系列】Yii2.0基础框架
缘起 因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客 提起Yii,虽然是国外的开发者搞的,但是它的作者是华人,这才是让我 ...
- Tcl与Design Compiler (八)——DC的逻辑综合与优化
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 对进行时序路径.工作环 ...
- 使用github+hexo搭建博客笔记
听说github上可以搭博客,而且不用自己提供空间和维护,哈哈哈 作为一名程序猿,github搭博客对我有种神奇的吸引力,赶紧动手试一试 关于如何使用hexo搭建博客网上好的教程多如牛毛,而且这篇博客 ...
- 参加光环国际PRINCE2培训
挑战埃及是全球首套能够同时适配PRINCE2认证人群,PMP认证人群的项目管理沙盘演练游戏.沙盘通过使用乐高积木作为道具,通过一场互动性极强的情景模拟为全球项目经理还原了四千年前古埃及金字塔建造的情景 ...
- Object-C定时器,封装GCD定时器的必要性!!! (一)
实际项目开发中经常会遇到延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. iOS中延迟操作有三种解决方案: 1.NSObject的方法:(对象方法) p ...