首页 > 编程语言 >LeetCode第31题:"下一个排列" C#篇

LeetCode第31题:"下一个排列" C#篇

时间:2024-11-27 15:47:50浏览次数:9  
标签:排列 数字 nums C# 31 int 数组 LeetCode 单调

理解题意:

 这道题大概的意思是,将nums数组换一个排列方式,但要求比当前排列要大并且是当前数组大的排列中最小的一种排列

思路:

相信很多人看到这题第一个会想到的思路是,我只需要将这个数组所有比当前数组大的排列都整理出来,再选出最小的那一个排列,此题可解

很显然啊....这不是一个标准的答案,这个思路的时间复杂度是O(n!) 也就是n的阶乘,拿示例1举例n=3那么就是1*2*3=6,假设n=100或者1000或者更高 所以....嗯....额你懂的对吧

 我们应该可以把这个时间复杂度优化到O(N),请各位观察下这两组数字

54321(排列前)

12345(排列后)

从上面数字中,我们看到单调递减的数字是无法得到这个解的,题目中的示例2也是如此,由此推测,正确答案是不是和单调递减有关系呢?

请再看下面这个示例

24534421(排列前)

 24541234(排列后)

会发现我们从右往前数,我找到那位破坏单调递增的数字,再找到比这个数字大中最小的那个数字(注意是要靠后),交换位置,并将后面的数字升序排序即可

这里解释一下,为什么要从右往前数,因为调换越后面的数字,整个排列变化的值越小,这样是离正确答案最近的一条选项,请看下面例子

64564353(排列前)

64564533(排列后)

所以最后总结一下,我们仅需要五步,即可优化这个算法

1.先判断该数组是否可以排列,不能排列则直接返回,比如nums[]{1}

2.找到从右往左数破坏单调递增那个数字

3.如果nums是单调递减的,直接反转后返回,因为单调递减的nums无法得出解

4.找到比第二点这个数字大的最小的这个数字,并调换他们的位置

5.将调换位置后数字后面数字全部升序排序

代码:

 1  /// <summary>
 2  /// 下一个排列
 3  /// </summary>
 4  /// <param name="nums"></param>
 5  /// <returns></returns>
 6  public static int[] NextArrangement(int[] nums)
 7  {
 9      int len = nums.Length;
10      if (len==1)
11      {
12          return nums;
13      }
14      
15      int i = len - 2;
16      while (i >= 0 && nums[i] >= nums[i + 1])
17      {
18          i--;
19      }
20 
21      if (i<0) 
22      {
23          reverse(nums, 0, len - 1);
24          return nums;
25      }
26 
27      int lg = i + 1;
28 
29      while (lg < len && nums[lg]>nums[i])
30      {
31          lg++;
32      }
33      
34      swap(nums, i, lg - 1);
35      reverse(nums, i + 1, len - 1);
36      
37      return nums;
38  }
39 
40  /// <summary>
41  /// 交换数组中的两个元素
42  /// </summary>
43  /// <param name="nums"></param>
44  /// <param name="i">开始下标</param>
45  /// <param name="j">结束下标</param>
46  private static void swap(int[] nums, int i, int j)
47  {
48      int temp = nums[i];
49      nums[i] = nums[j];
50      nums[j] = temp;
51  }
52 
53  /// <summary>
54  /// 反转数组中的元素
55  /// </summary>
56  /// <param name="nums">数组</param>
57  /// <param name="start">开始下标</param>
58  /// <param name="end">结束下标</param>
59  public static void reverse(int[] nums, int start, int end)
60  {
61      while (start < end)
62      {
63          swap(nums, start++, end--);
64      }
65  }

使用:

 1 #region 下一个排序
 2 //int[] nums = new int[] { 2, 4, 5, 3, 4, 4, 2, 1 };
 3 int[] nums = new int[] { 6, 4, 5, 6, 4, 3, 5, 3 };
 4 for (int i = 0; i < nums.Length; i++)
 5 {
 6     Console.Write(nums[i]);
 7 }
 8 Console.WriteLine("");
 9 var result=Calculation.NextArrangement(nums);
10 for (int i = 0; i < result.Length; i++) 
11 {
12     Console.Write(result[i]);
13 }
14 Console.Read();
15 #endregion

结果:

 从代码上看,这个算法最终的时间复杂度是O(n) ,我们这次到此结束喔,希望此篇文章对你有所启发,当然有更好的解决方案或者不明白的小伙伴欢迎留言

当然啦,如果可以给威某人点一个小小的赞就更好啦哈哈

 下篇再见,各位家人~

标签:排列,数字,nums,C#,31,int,数组,LeetCode,单调
From: https://www.cnblogs.com/shenweif/p/18571757

相关文章

  • Arch linux下把chromeOS安装至btrfs子卷
    旧的ChromeOS单独划分一个ext4分区安装,划分的是ChromeOS可用的最大空间,当存储未用满时,这个ChromeOS独占的分区就有很大的浪费。最近Brunch的作者发布了linux安装工具Linuxloops,可以把ChromeOS安装到Btrfs子卷。Linuxloops采用了图形安装界面,不需要提前下载Brunch及ChromeOS镜像。......
  • PAWNYABLE kernel stack overflow 笔记
    PAWNYABLE中的第一节stackoverflow的学习笔记。(觉得这个教程好细致,而且封面好可爱...这一节讨论内核的栈溢出,分成了不同防护程度的情况来讨论不同的情况下面,攻击应该如何进行。基本的思路在module_write里面,copy_from_user的大小是用户控制,大小没有检查的。可以在这里......
  • css 实现刘海屏样式兼容并支持 js 获取刘海屏高度后动态修改
    css:root{--safe-area-inset-top:0px;--safe-area-inset-right:0px;--safe-area-inset-bottom:0px;--safe-area-inset-left:0px;--safe-area-inset-constant-top:0px;--safe-area-inset-constant-right:0px;--safe-area-inset-constant-bottom:......
  • chroot子系统切换
    1、使用类似lsblk命令查看损坏系统位置root@ubuntu:/#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTloop07:002.2G1looploop17:104K1looploop27:2063.3M1looploop......
  • 海康大华宇视视频平台EasyCVR视频设备轨迹回放平台视频监控系统设计原则有哪些?
    在数字化时代,视频监控系统已成为安全管理的核心组成部分,它不仅关乎财产安全,更是公共安全和个人隐私保护的重要工具。随着技术的发展,视频监控系统的设计和实施越来越注重其先进性、经济性、可靠性和开放性。EasyCVR视频汇聚平台以其强大的兼容性和灵活性,为用户提供了一个全面的解......
  • 超详细!Apache Maven下载安装使用教程
    前言在当今的软件开发领域,尤其是基于Java平台的项目开发过程中,拥有一款高效、便捷的项目管理工具至关重要。本篇文章将聚焦于在Windows10系统下,为大家详细介绍ApacheMaven的下载与安装教程,帮助大家轻松上手这款功能强大的工具,更好地管理和构建Java项目。Maven的介绍M......
  • 【python应用】pySchema4neo : 一个简化Neo4j数据库操作的Python库
    在当今的数据分析领域,图数据库因其独特的存储方式和对复杂关系的处理能力而备受关注。Neo4j作为图数据库的佼佼者,拥有广泛的用户群体。对于Python开发者来说,pySchema4neo库的出现,无疑为使用Python与Neo4j交互提供了极大的便利。本文将详细介绍pySchema4neo库的安装、基本用法、高......
  • ZW3DC++调用C#的DLL
    C#:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceTestWinform{publicclassClass1{publicvoidopenForm(){Form1form=newForm1();form.ShowDialog();}}}  C++:......
  • asp.net core中webapi接口的动作与参数
    一、在asp.netcore的webapi可以指定接口的action动作类型,动作特性主要有Get,Post,Put,Delete,Head,Options,Patch,Trace,其中Get,Post,Delete是比较常用的1、Get:通常用于数据查询,请求参数一般是地址栏上的QueryString获取,请求参数默认为[FromQuery],该动作属于幂等操作①。......
  • 【以太网接口芯片----CH394 Webserver应用】使用以太网接口芯片CH394芯片搭建Webserve
    一、简介:本文会基于沁恒微电子最新的以太网协议栈芯片CH394来做一个远程Web浏览器控制的示例(主控芯片为CH32V307,SPI接口),简单演示通过以太网进行参数修改、数据传输、远程控制。相较于之前的CH395芯片,CH394的通信速度更快、功耗更低、外围电路更精简,因此选择CH394芯片来拓展需......