首页 > 其他分享 >LeetCode题练习与总结:下一个更大元素 Ⅲ -- 556

LeetCode题练习与总结:下一个更大元素 Ⅲ -- 556

时间:2025-01-18 23:33:09浏览次数:3  
标签:字符 数字 nums -- 复杂度 556 整数 数组 LeetCode

一、题目描述

给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。

注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。

示例 1:

输入:n = 12
输出:21

示例 2:

输入:n = 21
输出:-1

提示:

  • 1 <= n <= 2^31 - 1

二、解题思路

  1. 从右向左遍历数字n的每一位,找到第一个下降的数字,即找到第一个数字nums[i],使得nums[i] < nums[i+1]。如果没有找到这样的数字,则说明n是一个递减序列,直接返回-1。

  2. 从右向左再次遍历,找到第一个比nums[i]大的数字nums[j],交换nums[i]nums[j]

  3. nums[i+1]nums[n-1]的数字进行升序排序,以确保得到的是大于n的最小数字。

  4. 将数组转换成整数,检查是否超过32位整数的范围,如果没有,则返回该整数;否则返回-1。

三、具体代码

import java.util.Arrays;

class Solution {
    public int nextGreaterElement(int n) {
        char[] nums = String.valueOf(n).toCharArray();
        int i = nums.length - 2;
        
        // Step 1: Find the first decreasing element from the right
        while (i >= 0 && nums[i] >= nums[i + 1]) {
            i--;
        }
        
        // If no such element is found, return -1
        if (i < 0) {
            return -1;
        }
        
        // Step 2: Find the first element greater than nums[i] from the right
        int j = nums.length - 1;
        while (nums[j] <= nums[i]) {
            j--;
        }
        
        // Swap nums[i] and nums[j]
        swap(nums, i, j);
        
        // Step 3: Reverse the sequence after i to get the smallest number
        reverse(nums, i + 1, nums.length - 1);
        
        // Step 4: Convert char array back to integer and check for 32-bit overflow
        long result = Long.parseLong(new String(nums));
        return (result <= Integer.MAX_VALUE) ? (int) result : -1;
    }
    
    private void swap(char[] nums, int i, int j) {
        char temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    
    private void reverse(char[] nums, int start, int end) {
        while (start < end) {
            swap(nums, start, end);
            start++;
            end--;
        }
    }
}

这段代码定义了一个Solution类和一个nextGreaterElement方法,该方法实现了上述解题思路,并且包含了两个辅助方法swapreverse用于交换字符数组的元素和反转数组的一部分。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 寻找第一个下降的数字:这个步骤需要从右向左遍历整个数组一次,时间复杂度为O(N),其中N是数字n的位数。

  • 寻找第一个比nums[i]大的数字:在最坏的情况下,可能需要再次遍历整个数组,时间复杂度为O(N)。

  • 交换两个数字:这个操作的时间复杂度是O(1)。

  • 反转数组的一部分:反转从i+1nums.length - 1的部分,最坏情况下需要反转N/2个数字,时间复杂度为O(N)。

  • 将字符数组转换成整数:这个操作的时间复杂度是O(N),因为需要遍历整个数组。

综上所述,总的时间复杂度是O(N) + O(N) + O(1) + O(N) + O(N) = O(N),其中N是数字n的位数。

2. 空间复杂度
  • 字符数组nums:用于存储数字n的每一位,空间复杂度为O(N)。

  • 辅助变量:如ijtemp等,它们都是常数级别的空间,空间复杂度为O(1)。

  • 方法调用栈:由于没有使用递归或额外的数据结构,方法调用栈的空间复杂度也是O(1)。

因此,总的空间复杂度是O(N) + O(1) = O(N),其中N是数字n的位数。

五、总结知识点

  • 数据类型转换

    • 将整数n转换为字符数组nums,使用String.valueOf(n).toCharArray()
  • 字符数组操作

    • 使用字符数组来表示数字,并对其进行操作,因为字符数组支持交换元素和反转操作。
  • 循环和条件判断

    • 使用while循环来遍历数组,寻找特定的元素位置。
    • 使用if语句来处理边界情况,如找不到下降元素时返回-1。
  • 数组元素交换

    • 定义了一个辅助方法swap来交换字符数组中的两个元素。
  • 数组部分反转

    • 定义了一个辅助方法reverse来反转字符数组的一部分,以便生成下一个更大的数字。
  • 数学和逻辑

    • 理解并实现找到下一个更大数字的逻辑,包括如何找到第一个下降的元素,以及如何找到第一个比它大的元素。
  • 字符串和数字的相互转换

    • 使用Long.parseLong(new String(nums))将字符数组转换回长整型数字。
  • 溢出检查

    • 在将字符数组转换回整数后,检查结果是否在32位整数的范围内,以避免溢出。
  • 方法封装

    • 将交换和反转操作封装为私有方法,以保持代码的整洁和可重用性。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:字符,数字,nums,--,复杂度,556,整数,数组,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/145216285

相关文章

  • 从卡顿到丝滑:揭秘 requestAnimationFrame 的魔力
    从卡顿到丝滑:揭秘requestAnimationFrame的魔力你有没有遇到过这样的场景:页面上的动画看起来不流畅,画面有时一跳一跳,甚至在你点击或滚动时也感觉迟钝。别担心,这不全是你的代码问题,而是你还没找到实现完美动画的秘密武器!今天,我们就来揭开requestAnimationFrame这位动画背......
  • LeetCode题练习与总结:反转字符串中的单词 Ⅲ -- 557
    一、题目描述给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例1:输入:s="Let'stakeLeetCodecontest"输出:"s'teLekatedoCteeLtsetnoc"示例2:输入:s="MrDing"输出:"rMgniD"提示:1<=s.length<=5*10^......
  • 再学欧拉之欧拉定理
    没错,本文的一切还是为了它——\(\varphi\)。欧拉定理内容若\(a,n\)互质,则有\(a^{\varphi(n)}\equiv1\pmodn\)。证明设小于\(n\)且与\(n\)互质的自然数集合(即\(n\)的剩余系)为:\(X:x_1,x_2,x_3,\dots,x_{\varphi(n)},P:p_1=a\timesx_1,p_2=a\timesx_2,\dots,p_......
  • PTA:一维数组 简化的插入排序
    本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。输入格式:输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。输出格式:在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。输......
  • 一站式解决PDF文档的日常处理需求
    PDF24工具箱是一个功能全面且操作简便的PDF处理平台,为用户提供了一系列高效的文档处理服务。从创建、编辑到转换PDF文件,PDF24都能轻松应对。这个平台适合各类用户群体,包括学生、教师、职场人士以及自由职业者,且大部分功能均可免费使用。创建PDF文件当您需要将Word文档、图......
  • 518. 零钱兑换 II
    518.零钱兑换II给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。 题目数据保证结果符合32位带符号整数。示......
  • 深入HDFS——数据上传源码
    引入就如RPC篇章里提到的观点一样,任何一种能广为传播的技术,都是通过抽象和封装的思想,屏蔽底层底层复杂实现,提供简单且强大的工具,来降低使用门槛的。HDFS的风靡自然也是如此。通过前面深入了NameNode和DataNode的启动源码,我们已经是略有体会,但重启毕竟属于工作时几乎遇不到的......
  • MESED: A Multi-modal Entity Set Expansion Dataset with Fine-grained Semantic Cla
    MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities译文论文题目:MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities论文链接:https://ar......
  • 【JavaEE进阶】SpringMVC 响应
    目录......
  • 【LLM】Openai-o1及o1类复现方法
    note可以从更为本质的方案出发,通过分析强化学习的方法,看看如何实现o1,但其中的核心就是在于,如何有效地初始化策略、设计奖励函数、实现高效的搜索算法以及利用强化学习进行学习和优化。文章目录note一、Imitate,Explore,andSelf-Improve:AReproductionReportonS......