31. Next Permutation
题目:
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1
链接: http://leetcode.com/problems/next-permutation/
题解:
正常倒序应该是654321,假如652431,则2为inversion,并且next permutation应该为653124。
方法是从后向前找inversion,找到第一个inversion,如上例中,然后继续从后向前判断,假如从数组尾部到inversion元素 i 间有数字大于i, 则swap i 和这个数字,由于swap之后依然是倒序,所以我们reverse i 到 nums.length -1。
Time Complexity - O(n), Space Complexity - O(1)。
public class Solution {
public void nextPermutation(int[] nums) { // in place, so we consider swap
if(nums == null || nums.length == 0)
return;
for(int i = nums.length - 2; i >= 0; i--) { //find first inversion from end e.g. - 654231
if(nums[i] < nums[i + 1]) {
for(int j = nums.length - 1; j >= i; j--) {
if(nums[j] > nums[i]) {
swap(nums, i, j); //swap inversion element and swap i, keep descendent order
reverse(nums, i + 1, nums.length - 1); // i + 1 to nums.length - 1 if possible
return;
}
}
}
}
reverse(nums, 0, nums.length - 1); // no inversion
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
private void reverse(int[] nums, int lo, int hi) {
while(lo < hi)
swap(nums, lo++, hi--);
}
}
题外话:
1-20-2016:
最近刷题的劲头减弱,身体也并不很好,由于压力总是大失眠。给Amazon和Microsoft投递出了简历都是石沉大海,好挫败,常常看地里New Graduate很容易就能拿到onsite或者video interview,只回答几个简单问题就能拿到offer,很羡慕。有时候甚至想辞职去读一个名校CS学位。
负能量比较重。
希望二刷时好好锻炼好思维, 沉住气,耐心按照计划执行。已经付出这么多时间和努力,接下来就是要坚持下去。付出 + 坚持,我相信一定会有回报。自己给自己鼓励吧。
二刷:
主要还是用之前的办法。先从数组后部向前部找第一个正序的数对,比如(2, 3),(2, 4)一类。找到这第一个正序队之后,我们要另外设置一个变量j,也是从数组后部向前部查找,找第一个值nums[j] > nums[i],比如(2, 3, 1)。 找到之后我们要swap(i, j),这样就能保持 i + 1到 nums.length - 1这些数字呈现一个降序的排列,然后我们再reverse(i + 1, nums.length - 1)就可以了。假如数组中没有正序的数对,那么我们根据题意要对整个数组进行逆序。
二刷时看了一下discuss区yavinci大神的代码,真是简洁又漂亮,非常羡慕。
Java:
Time Complexity - O(n), Space Complexity - O(1)
public class Solution {
public void nextPermutation(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
for (int i = nums.length - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
for (int j = nums.length - 1; j > i; j--) {
if (nums[j] > nums[i]) {
swap(nums, i, j);
reverse(nums, i + 1, nums.length - 1);
return;
}
}
}
}
reverse(nums, 0, nums.length - 1);
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
private void reverse(int[] nums, int i, int j) {
while (i < j) {
swap(nums, i++, j--);
}
}
}
三刷:
Java:
public class Solution {
public void nextPermutation(int[] nums) {
if (nums == null || nums.length < 2) return;
int len = nums.length;
for (int i = len - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
for (int j = len - 1; j > i; j--) {
if (nums[j] > nums[i]) {
swap(nums, i, j);
reverse(nums, i + 1, len - 1);
return;
}
}
}
}
reverse(nums, 0, len - 1);
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
private void reverse(int[] nums, int i, int j) {
while (i < j) swap(nums, i++, j--);
}
}
Reference:
https://leetcode.com/discuss/8472/share-my-o-n-time-solution
https://leetcode.com/discuss/38247/algorithm-wikipedia-implementation-permutations-permutations
https://leetcode.com/discuss/70881/easiest-java-solution
https://leetcode.com/discuss/47076/1-4-11-lines-c
31. Next Permutation的更多相关文章
- LeetCode - 31. Next Permutation
31. Next Permutation Problem's Link ---------------------------------------------------------------- ...
- [Leetcode][Python]31: Next Permutation
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 31: Next Permutationhttps://oj.leetcode ...
- [array] leetcode - 31. Next Permutation - Medium
leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...
- LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]
LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation] <c++> LeetCode 31 Next Pe ...
- <LeetCode OJ> 31. Next Permutation
31. Next Permutation Total Accepted: 54346 Total Submissions: 212155 Difficulty: Medium Implement ne ...
- 刷题31. Next Permutation
一.题目说明 题目是31. Next Permutation,英文太差看不懂,翻译了一下.才知道是求字典顺序下的下一个排列,不允许使用额外空间.题目难度是Medium! 二.我的实现 首先要进一步理解 ...
- leetcode 31. Next Permutation (下一个排列,模拟,二分查找)
题目链接 31. Next Permutation 题意 给定一段排列,输出其升序相邻的下一段排列.比如[1,3,2]的下一段排列为[2,1,3]. 注意排列呈环形,即[3,2,1]的下一段排列为[1 ...
- [LeetCode] 31. Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- LeetCode 【31. Next Permutation】
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
随机推荐
- 如果在配置中将“system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”设置为 true,则需要终结点指定相对地址。如果在终结点上指定相对侦听 URI,则该地址可以是绝对地址。若要解决此问题,请为终结点“http://localhost/Service1.svc”指定相对 URI。
问题: 如果在配置中将"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"设置为 ...
- SQLserver Delete from where 与Oracle delete from where 的差异
1.SQLserver 版本: select @@version; Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) Dec 28 2012 20 ...
- Windows7鼠标右键里没有新建文本文件的选项,解决办法
1.“开始”->“运行”,输入"regedit",打开注册表编辑器 2.展开HKEY_CLASSES_ROOT,找到.txt 3.选中.txt,查看右侧窗格的“默认值”是不是 ...
- 1106. Lowest Price in Supply Chain (25)
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- Oracle物理的体系结构
体系结构图的学习: 老余服装店的故事 结构图: SQL查询语句 SGA 共享池shared pool 数据缓存区Buffer cache PGA 进程 SQL更新语句 SGA: 日志缓存区 日志文件 ...
- 提高Linux上socket性能
在 开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求.利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序.本文内容包括对于 Soc ...
- 纯JS文本比较工具
前段时间由于工作需要写了一个纯JS文本比较工具 在这里与大家分享下 算法有待优化,还希望大家多多指教 先上效果图: 奉上源码(把源码保存为html格式的文件就可以直接运行了): <!doctyp ...
- [WinForm]- 设置DataGridView单元格内根据不同值显示图片
首先设置要显示图片的列 DataGridViewImageColumn status = new DataGridViewImageColumn(); status.DisplayIndex = ; ...
- 对象图 Object Diagram
一.用一张图来介绍一下对象图的基本内容 二.对象图与类图的基本区别 三.对象图实例
- How to tune SharePoint 2010 Server for better performance?
http://social.technet.microsoft.com/wiki/contents/articles/7926.sharepoint-2010-tips-for-dealing-wit ...