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接口自动化--使用正则提取器,可以把上一个请求的结果取出来,作为下一个请求的入参
随机推荐
- 2005: [Noi2010]能量采集
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 1831 Solved: 1086[Submit][Statu ...
- 安装rabbitmq以及集群配置
前言: (一些有用没用的唠叨,反正看了也不少肉,跳过也没啥) 情况是这样的:虚拟机.CentOS 6.5.免编译包安装rabbitmq集群,可不用连外网. 我原计划是安装在虚拟机上wyt1/wyt2/ ...
- UML软件方法大纲
利用周末的时间读了潘加宇的<软件方法(上)>,希望梳理清楚UML的知识脉络: 工作流 子流程 内容 备注 建模和uml 利润=需求-设计 愿景 缺乏清晰.共享的愿景往往是项目失 ...
- iOSiOS开发之数据存储之NSKeyedArchiver
1.概述 NSKeyedArchiver归档和plist文件存储不同的是NSKeyedArchiver可以直接保存对象.如果对象是NSString.NSDictionary.NSArray.NSDat ...
- linux 私房菜 CH8 linux 磁盘与文件系统管理
索引式文件系统 superblock 记录此系统的整体信息,包括 inode/block 的总量.使用量.剩余量,以及文件系统的格式与相关信息等: inode 记录档案的属性,一个档案占用一个 ino ...
- iwebshop里面传数组且输出
//php后台 $starttimestr = $arr[0]['forea_time']; $endtimestr = $arr[0]['end_time']; $data['starttime'] ...
- 开始学习yii2第一天
今天在朋友圈看到一条转发,内容是根据招聘网站的要求,列举了需要一个php工程师具体需要哪些技能 框架要求是yii2 出现的最多 已经出来工作了快半个月了,感觉工资还是少的可怜,而且我也好想去张江, 所 ...
- Servlet3.0新特性使用详解
可插拔的Web框架 几乎所有基于Java的web框架都建立在servlet之上.现今大多数web框架要么通过servlet.要么通过Web.xml插入.利用标注(Annotation)来定义servl ...
- sql server 重命名列(字段)
调用系统存储过程sp_rename,直接看代码: EXEC sp_rename 'myTable.oldName','newName','COLUMN' 如果重命名表,则: EXEC sp_re ...
- 云计算+SaaS+业务开发平台=JSAAS云平台
我关注Google的代码托管.Open API,我也关注Oracle会把MYSQL怎么样云数据库化,我也虚拟化技术多实例化独立的数据库,我也关注facebook的平台插件应用架构,我也关注salesf ...