当前位置: 首页 > article >正文

计算机低能儿从0刷leetcode | 31.下一个排列

题目:31. 下一个排列

思路:

本题中,我们需要寻找“下一个排列”,也就是要找到增长最小的排列。

因此我们应该从尽可能从靠右侧(末尾)的位置开始增长。想象我们从末尾开始遍历数组,会遇到第一个波峰,也就是nums[i] > nums[i-1](如果找不到,说明没有下一个排列,那么就把整个序列升序排列即可),而其右边的序列如果存在,一定是降序,否则当前就不是第一个波峰了;所以我们想要让原序列增大,在nums[i]右边为降序的情况下,我们只能去增大nums[i-1],而我们又要最小程度地增大,因此我们就选择[i,len-1]下标范围里大于nums[i-1]中最小的那个数与nums[i-1]交换,而因为[i,len-1]为降序,因此我们从数组末尾查找,找到第一个大于nums[i-1]的值,就是需要交换的值;交换之后,因为i-1位置的数值已经比原来大了,所以一定满足大于原序列的条件,而为了满足是下一个排列,我们还需要把[i,len-1]位置的元素升序排列,至此就找到了“下一个排列”。

因此主要过程分为三部分:

1、从末尾寻找第一个nums[i] > nums[i-1]的位置,找不到就把整个数组升序排列并return。

2、从末尾寻找第一个大于nums[i-1]的值,和nums[i-1]交换。

3、将[i,len-1]位置升序排列。

代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
       int len=nums.size();
       int flag=0,i=0;
        for(i=len-1;i>0;i--){
            if(nums[i]>nums[i-1]){
                flag=1;
                break;
            }
        }
        if(flag==0){
           sort(nums.begin(),nums.end());
             return;
        }

        for(int j=len-1;j>i-1;j--){
            if(nums[j]>nums[i-1]){
                swap(nums[j], nums[i-1]);
                break;
            }
        }
        sort(nums.begin()+i,nums.end());
        return ;
    }
};

要点:

之前很少使用sort函数,sort(nums[i], nums[j])的方法是错误的,而应该写作sort(nums.begin()+i,nums.end())。


http://www.kler.cn/a/371998.html

相关文章:

  • 【EtherCATBasics】- KRTS C++示例精讲(2)
  • C# 中使用 MassTransit
  • Windows系统下载、部署Node.js与npm环境的方法
  • ajax是什么?作用是什么?交互流程有哪些阶段?
  • libreoffice在Windows和Linux环境的安装和结合Springboot使用教程
  • OpenCV-Python实战(10)——形态学
  • 重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer
  • Flux-IP-Adapter-V2版本发布,效果实测!是惊喜还是意外?
  • 【PythonWeb开发】Flask-RESTful风格编程
  • itertools模块的combinations很牛
  • 基于Springboot的在线考试与学习交流平台的设计与实现
  • Spring Boot:打造智能植物健康监测平台
  • QT找不到ffmpeg链接库解决方法
  • 用Java查询比特币实时行情 - 附免费查询接口
  • 深入理解Allan方差:用体重数据分析误差的时间尺度与稳定性
  • 《C++音频频谱分析:开启声音世界的神秘之门》
  • tomcat Java项目cpu飙升
  • Mybatis 批量操作存在则更新或者忽略,不存在则插入
  • 【论文阅读】Persistent Homology Based Generative Adversarial Network
  • CSS flex布局- 最后一个元素占满剩余可用高度转载
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 正则表达式笔记
  • Windows目录共享到Linux
  • vue2和vue3在html中引用组件component方式不一样
  • 聊聊AI时代的新岗位
  • 软件测试-覆盖率测试-四关全