面试手撕算法题--下一个排列

news2025/1/21 18:45:09

前言

面试官描述这个题的时候,我就感觉似曾相识似乎做过,面完以后到leetcode找到原题恨不得给自个儿来一下子,的确,当时调api爽了,然后呢面试被拷打了啊,我想不起来这个api具体怎么解决这个题目的底层原理,只能 自信的 给面试官来了一套暴力解法,然后面试官还温柔的好心引导我怎么做,但是我还是没搞定,最后面完之后邮件发给他具体代码,以下如图,暴力解法4ms,优化正解0ms。
在这里插入图片描述

一、题目详情

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。

二、解题思路与代码

理解题目如下:
给定整数数组的一个排列,返回刚好比上一个排列大的下一个排列。
就是将其所有成员以序列或线性顺序排列后其整数的下一个字典序更大的排列
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
其排列后组合的大小排序为123,132,231,312,所以返回132

粗解思路:
1、把所有的排列列出来存储成一个数组
2、对该数组进行排序
3、返回给定数组的下一个排列值

优化思路:
1、从右向左扫描,找到第一个i<i+1的数
2、最右边开始找到右边第一个大于这个数的数(也就是比它大的最小数),进行交换
3、从i+1开始往后的位置都翻转

ps: 面试时是直接描述了题目在Dev里做的,我直接用string存了做的,但是整数数组也同理,同样的思路,代码变化不大,具体的可以在 :https://leetcode.cn/problems/next-permutation/ 里看原题。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
using namespace std;

// 暴力思路求解 
string nextMaxNum1(string& str){
	string str1 = str;//临时存储 
	vector<string> ans;
	do{
		ans.push_back(str1);
//		cout<<str<<endl;
	} while(next_permutation(str1.begin(), str1.end()));//不断存储下一个排列 
	sort(ans.begin(), ans.end());//排序 
	int i = 0;
	for(; i < ans.size(); i++){
		if(ans[i] == str) break;
	}
	return ans[i+1];//找到的下一个最大的值返回 
}

// 优化思路求解 
string nextMaxNum2(string& str){
	int len = str.size();
    if(len <= 1)
        return str;
    int i = len - 2;
    while(i >= 0 && str[i] >= str[i+1]){//找到第一个i<i+1的数
        i--;
    }
    if(i >= 0){
        int j = len - 1;
        while (j >= 0 && str[i] >= str[j]) {//找到右边第一个大于这个数的数
            j--;
        }
        swap(str[i], str[j]);//交换 
	}	
   	reverse(str.begin() + i + 1, str.end());
    return str;
}

int main(){
	string arr = "12345";
	cout<< nextMaxNum1(arr) << endl;//解法1 
	
	cout<< nextMaxNum2(arr) << endl;//解法2 
	return 0;
}

后记

官方曰:该优化方法支持序列中存在重复元素,且在 C++ 的标准库函数 next_permutation 中被采用。
意思就是 next_permutation 底层就是这样干的?哇呀呀呀,以后刷题一定不要偷懒啊,我有时面对能够调api或者取巧解决的方法,就没有深入研究这个题目最优解法,必须反省啊!要做一个题目,就要把这个题目研究透彻!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【非递归】手搓快速排序

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 快速排序已经带大家实现过了&#xff0c;我们用到的方法是递归法&#xff0c;你知道吗&#xff0c;用循环也可以实现快速排序&#xff0c;来看看吧。 注&#xff1a; 这篇博客属于数据结构…

FE_CSS 基础选择器 字体属性 文本属性 综合案例

1 CSS 基础选择器 选择器分为基础选择器和复合选择器两个大类&#xff0c;基础选择器是由单个选择器组成的&#xff0c;基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器。 1.1 标签选择器 标签名{属性1: 属性值1; 属性2: 属性值2; 属性3: 属性…

从0-1搭建交付型项目管理体系流程-- 项目启动篇【宝芝林5】

一. 目标及作用 本阶段主要的目标是签订合同及SOW工作说明书&#xff0c;其里程碑事件为甲乙双方完成合同及SOW工作说明书签字及盖章&#xff0c;以及召开项目启动会。 主要作用是明确项目甲乙双方的权利和义务&#xff0c;以及与甲方及其他实施团队共同制定项目章程&#xf…

有趣的Hack-A-Sat黑掉卫星挑战赛——被破坏的阿波罗计算机(解法一)

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

面试官:你做过什么有亮点的项目吗?

前言 面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目吗&#xff1f; 面试官其实是想看看你做过什么有亮点的项目, 其实大家日常做的项目都差不多&#xff0c;增删改查&#xff0c;登录注册&…

如何压缩照片到30kb以下?三个方法

如何压缩照片到30kb以下&#xff1f;随着网络的发展&#xff0c;我们经常要上传一些照片到网上&#xff0c;如公务员考试&#xff0c;教师招聘等&#xff0c;而且要求上传的照片大小不超过30kb&#xff0c;我们如何把照片压缩到30kb以下呢&#xff1f;现在很多平台上传图片时都…

【Arduino机器人手臂和麦克纳姆轮平台自动操作】

【Arduino机器人手臂和麦克纳姆轮平台自动操作】 1. 概述2. 构建 Arduino 机器人3. Arduino机器人电路图4. Arduino Code在本教程中,我将向您展示我如何从我以前的视频中制作我的 Mecanum Wheels 机器人平台,以便与我的 3D 打印机械臂协同工作并自动操作,这也是我之前视频之…

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

概述 Redis高可用高性能缓存的应用系列的第3篇&#xff0c;主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明。 Redis过期键删除策略 Redis设置key时&#xff0c;都会设置一个过期时间&#xff0c;那么当过期时间到了都是怎么处理的&#xff1f;…

C++ 缺省参数 函数重载 引用

缺省参数&#xff0c;我们先看一下什么是缺省参数 首先&#xff0c;这个是我们的需要传参的函数&#xff0c;这里我们传入 1 然后就输出 a 下面我们就看一下缺省参数 我们现在看main函数里面调用fun函数&#xff0c;这里会输出多少呢&#xff1f; OK 这里我们分别输出了0 和 1…

在线文章生成器-文章生成器在线生成

免费自动写作软件 目前市面上存在一些免费自动写作软件&#xff0c;以下介绍几个开源的自动写作软件。 GPT-2&#xff1a;这是由OpenAI推出的一款自动写作工具&#xff0c;它可以生成高质量的文章&#xff0c;其优点在于能够理解语言结构和语法规则&#xff0c;从而生成表达自…

如何建立含有逻辑删除字段的唯一索引

文章目录业务场景分析解决总结业务场景 在实际工作当中&#xff0c;遇到一个场景&#xff0c;就是在用户注册时&#xff0c;名字要全局唯一&#xff0c;当然&#xff0c;我们是可以对用户进行删除的&#xff0c;你会怎么去做&#xff1f; 分析 一般来说&#xff0c;我们可以…

Java语法理论和面经杂疑篇《八. File类和IO流》

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2 列出目录的下一级 3 File类的重命名功能 4 判断功能的方法 5 创建、删除功能 1.4 练习 2. IO流原理及流的分类 ​编辑 2.1 Java IO原理 2.2 流的分类 2.3 流的API …

5.基于多能互补的热电联供型微网优化运行

说明书 代码相关资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&#xff1b;样本削减 风电场风速两参数weibull(威布尔)分布的MATLA…

干翻Hadoop系列之:Hadoop前瞻之分布式知识

前言 一&#xff1a;海量数据价值 二&#xff1a;海量数据两个棘手问题 1&#xff1a;海量数据如何存储&#xff1f; 掌握分布式存储数据的思想。 A&#xff1a;方案1&#xff1a;单机存储磁盘不够加磁盘 限制问题&#xff1a; 1&#xff1a;一台计算机不能无限制拓充 2&a…

tomcat安装与配置

目录 1、安装jdk(官方站点下载 jdk-8u60-linux-x64.tar.gz ) 2、安装tomcat&#xff08;官方站点下载apache-tomcat-8.5.20.tar.gz&#xff09; 3、在浏览器上输入http://192.168.88.144:8080 4、写一个启动关闭的服务脚本 5、布置jpress应用 6、浏览器地址栏输入http://192…

真正的ChatGPT平替产品:Claude

01 Claude ChatGPT已经流行了很长的时间了&#xff0c;但是ChatGPT 由于种种的限制&#xff0c;我们无法用上&#xff0c;也有很多的平替产品&#xff0c;但是这些平替产品也有很多的问题。 现在 Claude 出来了&#xff0c;没有任何的限制。 Claude 不用魔法&#xff0c;注…

go test main包报错

前言 先提出问题, 再说明原因. 有如下一段代码: 当执行go test测试时, 会报如下错误: main.test /var/folders/55/47pl3jxx6rg7m0r6xvn4f7wr0000gn/T/go-build2769402238/b001/_testmain.go:13:8: could not import main (cannot import “main”) FAIL main [build failed] 什…

Linux文件类型详解

在Linux中一切都是文件&#xff0c;但文件都得有类型。那如何查看文件是什么类型了&#xff1f;在Linux中可以使用以下命令 ls -l path在显示文件的属性通常会以如下形式进行显示&#xff1a; drwxr-xr-x第1个字母&#xff1a;代表文件类型 第2~4字母&#xff1a;代表用户的权…

Dell戴尔笔记本电脑G5 SE 5505原装出厂Windows10系统恢复原厂oem系统1909

Dell戴尔笔记本电脑G5 SE 5505原装出厂Windows10系统恢复原厂oem系统1909 链接&#xff1a;https://pan.baidu.com/s/1imNdbSvxEqbMI3ODo-K3qQ?pwdhdez 提取码&#xff1a;hdez

Kubernetes安全加固

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130034953 一、认证安全配置 1.1、X.509客户端证书 X.509客户端证书是目前用户最常用的认证安全配置方式&#xff0c;其也可称作HTTPS证书认证&#xff0c;是基于CA根证书签名的双向数字证书认证方式…