零 标题:算法(leetode,附思维导图 + 全部解法)300题之(31)下一个排列

一 题目描述

二 解法总览(思维导图)

三 全部解法

1 方案1

1)代码:

// 方案1 “双指针法”。
// 通过:213 / 265 。未通过例子:[4,2,0,2,3,2,0] 。 // 技巧:“双指针”大部分适用于 “数组”(双向,向前、向后都可以走)、“链表”(只能单向的向后走)。
// 因为 “算法 与 数据结构 相适应” —— 类比生物学里的 “结构与功能相适应”。 // 思路:
// 1)2)利用 i( 范围:[l - 1, 1] )、j( 范围:[i - 1, 0] ) 双指针
// 2.1)找到符合 nums[i] > nums[j] 条件的 i、j 下标
// 2.1.1)进行 “值交换”
// 2.1.2)对 nums ,(j + 1)下标后面的数进行重排为升序
// 3)边界处理。若 此时 nums 是最大的排列,则 直接将 nums 重排为升序排列即可~
var nextPermutation = function(nums) {
// 1)状态初始化
const l = nums.length; // 2)利用 i( 范围:[l - 1, 1] )、j( 范围:[i - 1, 0] ) 双指针
for (let i = l - 1; i >= 1; i--) {
for (let j = i - 1; j >= 0; j--) {
// 2.1)找到符合 nums[i] > nums[j] 条件的 i、j 下标
if (nums[i] > nums[j]) {
// 2.1.1)进行 “值交换”
[nums[i], nums[j]] = [nums[j], nums[i]];
// 2.1.2)对 nums ,(j + 1)下标后面的数进行重排为升序
let tempList = nums.slice(j + 1);
tempList.sort((a, b) => a - b);
nums.splice(j + 1, (l - j - 1), ...tempList);
return;
}
}
} // 3)边界处理。若 此时 nums 是最大的排列,则 直接将 nums 重排为升序排列即可~
nums = nums.sort((a, b) => a -b);
};

2 方案2

1)代码:

// 方案2 “他人方案”。

// 参考:
// 1)https://leetcode-cn.com/problems/next-permutation/solution/jie-fa-hen-jian-dan-jie-shi-qi-lai-zen-yao-jiu-na-/
var nextPermutation = function(nums) {
const l = nums.length;
let i = l - 2; // 从右往左遍历拿到第一个左边小于右边的 i,此时 i 右边的数组是从右往左递增的
while (i >= 0 && nums[i] >= nums[i+1]){
i--;
} if (i >= 0){
let j = l - 1;
// 从右往左遍历拿到第一个大于nums[i]的数,因为之前nums[i]是第一个小于他右边的数,所以他的右边一定有大于他的数
while (j >= 0 && nums[j] <= nums[i]){
j--;
}
// 交换两个数
[nums[j], nums[i]] = [nums[i], nums[j]]
} // 对 i 右边的数进行交换
// 因为 i 右边的数原来是从右往左递增的,把一个较小的值交换过来之后,仍然维持单调递增特性
// 此时头尾交换并向中间逼近就能获得 i 右边序列的最小值
let left = i + 1;
let right = l - 1;
while (left < right){
[nums[left], nums[right]] = [nums[right], nums[left]]
left++
right--
}
}

31、下一个排列 | 算法(leetode,附思维导图 + 全部解法)300题的更多相关文章

  1. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  2. 35、搜索插入位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(35)搜索插入位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要 ...

  3. 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...

  4. 32、最长有效括号 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(32)最长有效括号 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "滑动窗 ...

  5. 33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 & ...

  6. LeetCode 31. 下一个排列 | Python

    31. 下一个排列 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改, ...

  7. Java实现 LeetCode 31下一个排列

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

  8. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  9. Leetcode题目31.下一个排列(中等)

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

随机推荐

  1. 利用 CSS Overview 面板重构优化你的网站

    本文将向大家介绍 Chrome 87 开始支持的 CSS Overview Panel,并且介绍如何更好地利用这个面板.通过 CSS Overview Panel,可能可以帮助我们: 更准确(高保真) ...

  2. Windows Terminal 和 WSL

    Windows Terminal ,配置启动目录为 WSL : \\wsl$\Ubuntu\home

  3. (翻译)领域驱动设计实现-Implementing Domain Driven Design

    简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...

  4. Java:HashTable类小记

    Java:HashTable类小记 对 Java 中的 HashTable类,做一个微不足道的小小小小记 概述 public class Hashtable<K,V> extends Di ...

  5. Scrum Meeting 14

    第14次例会报告 日期:2021年06月07日 会议主要内容概述: 汇报了已完成的工作,明确了下一步目标,正在努力赶进度. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wi ...

  6. python +spatialite + window 解决方案(https://www.jianshu.com/p/5bc7d8b7b429)

    运行环境在windows 10 64bit.先将python安装完成.然后,到 spatilite官网 找到MS(即Microsoft)版本,下载64位的mod_spatialite,将其先解压到目标 ...

  7. Machine learning (8-Neural Networks: Representation)

    1.Non-linear Hypotheses 2.Neurons and the Brain 从某种意义上来说,如果我们能找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法,也许这将 ...

  8. 第33篇-方法调用指令之invokeinterface

    invokevirtual字节码指令的模板定义如下: def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invoke ...

  9. MyBatis源码分析(三):MyBatis初始化(配置文件读取和解析)

    一. 介绍MyBatis初始化过程 项目是简单的Mybatis应用,编写SQL Mapper,还有编写的SqlSessionFactoryUtil里面用了Mybatis的IO包里面的Resources ...

  10. STM32程序异常——中断处理要谨慎

    问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...