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. 下一个排列)-两次遍历的主要内容,如果未能解决你的问题,请参考以下文章