题目描述:

给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i]和 A[j] 的位置)后得到的、按字典序排列小于 A 的最大可能排列。

如果无法这么操作,就请返回原数组。

示例 1:

输入:[3,2,1]
输出:[3,1,2]
解释:
交换 2 和 1

示例 2:

输入:[1,1,5]
输出:[1,1,5]
解释:
这已经是最小排列

示例 3:

输入:[1,9,4,6,7]
输出:[1,7,4,6,9]
解释:
交换 9 和 7 思路:
对数组A(A.size()=n),从后往前遍历,找到第一个A[i]<A[i-1]的i(i>0,找不到说明没办法调整,返回A),然后在下标i到n-1的数中找到小于A[i-1]的最大值max,找到下标i到n-1数中第一个等于max的j,交换A[j]和A[i-1]. C++:
class Solution {
public:
vector<int> prevPermOpt1(vector<int>& A) {
if (A.size() == ) return A;
for (int i = A.size() - ; i > ; i--){
if (A[i] < A[i - ]){
int max = A[i];
for (int j = i; j < A.size(); j++){
if (A[j] < A[i - ] && max < A[j]) max = A[j];
}
for (int j = i; j < A.size(); j++){
if (A[j] == max){
A[j] = A[i - ];
A[i - ] = max;
return A;
}
}
}
}
return A;
}
};

python:

class Solution:
def prevPermOpt1(self, A: List[int]) -> List[int]:
if len(A)==1: return A
for i in range(len(A)-1,0,-1):
if A[i]<A[i-1]:
max=A[i]
for j in range(i,len(A)):
if A[j]<A[i-1] and max<A[j]:
max=A[j]
for j in range(i,len(A)):
if A[j]==max:
A[j]=A[i-1]
A[i-1]=max
return A
return A

C++运行时间152 ms,暂时超过90.57%的提交,目前最快的解法112ms,code:

class Solution {
public:
vector<int> prevPermOpt1(vector<int>& A) {
int length = A.size();
if(length <= ){
return A;
}
int flag = false;
int i = ;
int index = -;
while(i < length){
if(A[i] < A[i - ]){
index = i - ;
}
i++;
}
if(index != -){
int swapIndex = index + ;
int maxTemp = A[index + ];
for(int j = index + ; j < length; j++){
if(A[j] < A[index] && A[j] > maxTemp){
maxTemp = A[j];
swapIndex = j;
}
}
A[swapIndex] = A[index];
A[index] = maxTemp;
}
return A;
}
};
 

leetcode-1053. 交换一次的先前排列的更多相关文章

  1. SQL语句中IF的简单使用 - 关联leetcode 627.交换工资

    MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 & ...

  2. LeetCode 31. Next Permutation (下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  3. “全排列”问题系列(一)[LeetCode] - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题

    转:http://www.cnblogs.com/felixfang/p/3705754.html 一.开篇 Permutation,排列问题.这篇博文以几道LeetCode的题目和引用剑指offer ...

  4. LeetCode(31): 下一个排列

    Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...

  5. #leetcode刷题之路31-下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列.如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须原地修改,只允许使用额外常数空间. 以下 ...

  6. leetcode 31. Next Permutation (下一个排列,模拟,二分查找)

    题目链接 31. Next Permutation 题意 给定一段排列,输出其升序相邻的下一段排列.比如[1,3,2]的下一段排列为[2,1,3]. 注意排列呈环形,即[3,2,1]的下一段排列为[1 ...

  7. 【LeetCode】1409. 查询带键的排列 Queries on a Permutation With Key

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 模拟 日期 题目地址:https://leetcode ...

  8. LeetCode 笔记21 生成第k个排列

    题目是这样的: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all ...

  9. 【LeetCode每天一题】Permutation Sequence(排列序列)

    The set [1,2,3,...,n] contains a total of n! unique permutations.By listing and labeling all of the ...

随机推荐

  1. 62、saleforce的schedule

    //需要实现 Schedulable接口,实现 execute方法 public class MerchandiseSchedule implements Schedulable{ public vo ...

  2. MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎

    文章目录 Mysql逻辑架构介绍 总体概览 总体概览 mysql存储引擎 查看命令 看你的 mysql 现在已提供什么存储引擎 : 看你的 mysql 当前默认的存储引擎 : 各个引擎简介 MyISA ...

  3. A + B Problem II HDU - 1002

    非常简单的大数加法,因为不会Java只能手写大数加法了;博客存一下以后回来看看 #include<bits/stdc++.h> using namespace std; +; char A ...

  4. Promise篇

    Promise 原理解析与实现(遵循Promise/A+规范)   1 什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解 ...

  5. Spring Cloud动态刷新配置信息

    有时候在配置中心有些参数是需要修改的,这时候如何不重启而达到实时生效的效果呢? 添加依赖 <dependencies> ... <dependency> <groupId ...

  6. 学习Spring时用Idea中Maven Project创建一个子module出现了子pom.xml没有继承父pom.xml

    正常情况: 解决方法: 1.首先点击父项目右键 -->new-->Module 2.不用点击create from achetype直接点击next 3.在ArtifactId输入你要mo ...

  7. C#中的元组对象Tuple

    原文:C#中的元组对象Tuple 一.什么是元组 元组就是一些对象的集合,在我们编程时,比如一个人的信息,我们常常创建一个Person类去描述一个人,传统的做法如下: public class Per ...

  8. 学习vim 从常用按键开始

      ctrl+e 将屏幕下滚一行 ctrl+u 将屏幕上滚半页 ctrl+d 将屏幕下滚半页 ctrl+b 将屏幕上滚一页 ctrl+f 将屏幕下滚一页 撤销 u 前进 ctrl r 移动 下一个单词 ...

  9. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  10. MNIST多图显示--Python练习

    在学习TensorFlow框架时,提到用MNIST手写数字数据库进行练习,为了更直观看下里面的数据到底长啥样,用OpenCV(cv2)中的imshow函数来进行显示. 默认已经安装: numpy.te ...