下一个更大元素

556.下一个更大元素 III

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

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

1
2
3
4
输入:n = 12;
输出:21;
输入:n = 123;
输出:132;

思路:从后向前搜索,第一次发现左侧元素小于右侧元素时,交换,并对交换后的元素之后的元素进行反转

31.下一个排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public int nextGreaterElement(int n) {
char[] nums = Integer.toString(n).toCharArray();
for(int i = nums.length-2;i>=0;i--){
for(int j=nums.length-1;j>i;j--){
if(nums[j]>nums[i]) {
//先交换
swap(nums,i,j);
//再反转
reverse(nums,i+1,nums.length-1);
long res = Long.parseLong(new String(nums));
return res>Integer.MAX_VALUE?-1:(int)res;
}
}
}
return -1;
}
void reverse(char[] nums,int start,int end){
int left = start;
int right = end;
while(left<=right){
swap(nums,left++,right--);
}
}
void swap(char[] nums,int i,int j){
char c = nums[i];
nums[i]=nums[j];
nums[j]=c;
}
}

算法技巧,字符串与数字的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//将整数转换为数组
char[] nums = Integer.toString(n).toCharArray();
//将数组转换为字符串
String s = new String(nums);
//将数组转换为整数
int n = Integer.parseInt(new String(nums));
//将ArrayList转换为字符串
ArrayList<> list = new ArrayList<>();
Object[] o = list.toArray();//toArray只会返回一个Object数组
char[] c = new char[o.length];
for (int i = 0; i < o.length; i++) {
c[i] = o[i].toString().charAt(0);
}
String s = new String(c);

下一个更大元素
http://example.com/post/下一个更大元素.html
作者
SamuelZhou
发布于
2022年11月24日
许可协议