556 下一个更大元素-03
线性解法
class Solution {
public int nextGreaterElement(int n) {
int[] nums = new int[10];
int tmp = n;
int i = 0;
while (tmp > 0) {
nums[i++] = tmp % 10;
tmp /= 10;
}
int j;
for (j = 0; j < i - 1; j++) {
if (nums[j] > nums[j + 1]) {
break;
}
}
if(j==i-1){
return -1;
}
for (int k = 0; k <= j; k++) {
if (nums[k] > nums[j + 1]) {
swap(nums, j + 1, k);
break;
}
}
//反转0-j的数字
reverse(nums,0,j);
int ans = 0;
for (int a = i - 1; a >= 0; a--) {
if(ans>214748365){
return -1;
}
if(ans==214748364&&nums[a]>7){
return -1;
}
ans = ans * 10 + nums[a];
}
return ans;
}
public void swap(int[] nums, int a, int b) {
int tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
}
public void reverse(int[] nums,int start,int end){
if(start>end){
return;
}
while (start<end){
swap(nums,start,end);
start++;
end--;
}
}
}
时间复杂度
O
(
n
)
O(n)
O(n),
n
n
n是给定数字的位数。
空间复杂度
O
(
n
)
O(n)
O(n),使用了辅助数组。