556. 下一个更大元素 III-(31. 下一个排列)-两次遍历

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了556. 下一个更大元素 III-(31. 下一个排列)-两次遍历相关的知识,希望对你有一定的参考价值。

一、题目描述

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

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

示例 1:
输入:n = 12
输出:21
示例 2:
输入:n = 21
输出:-1

二、解题

两次遍历





这题类似于31题下一个排列,只不过这里出现的是给一个正整数,31题是一个数组,所以需要将正整数变为字符数组即可。


public class Solution 
    public int nextGreaterElement(int n) 
        //将数字转为字符数组
        char[] nums = ("" + n).toCharArray();
        int length = nums.length;
        int end = length - 2;
        //如果当前值大于后面的那个值,继续往前找,一直找到第一个升序的下标
        while(end >= 0 && nums[end] >= nums[end+1])
            end--;
         
        //注意边界条件
        if(end < 0)
            return -1;
        

        //找到下标值后,在找到后面大于下标值的值
       
        if(end >= 0)
            int next = length - 1;
            while(next >= 0 && nums[end] >= nums[next])
                next--;
            
            swap(nums,end,next);
        

        //翻转
        reverse(nums,end+1);
        //防止越界
        try 
            return Integer.parseInt(new String(nums));
         catch (Exception e) 
            return -1;
        
    
    //翻转数组
    public void reverse(char[] nums,int left)
        int right = nums.length-1;
        while(left <= right)
            swap(nums,left,right);
            left++;
            right--;
        
    
    //交换数组
    public void swap(char[] nums,int left,int right)
        char temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    

以上是关于556. 下一个更大元素 III-(31. 下一个排列)-两次遍历的主要内容,如果未能解决你的问题,请参考以下文章

556. 下一个更大元素 III

LeetCode 556. 下一个更大元素 III(Next Greater Element III)

每日一题556. 下一个更大元素 III

Leetcode 556.下一个更大元素III

字符串556. 下一个更大元素 III

leetcode 556. 下一个更大元素 III