leetcode 556. Next Greater Element III
题意:给你一个数n,让你交换这个数中的一些位,找个一个比n大的最小的数,n是32位。有的话输出那个数,没有输出-1.
思路:模拟一下交换过程就好了。
看个例子,对于230241
我们可以交换 i = 2,j = 3; i=2,j=4; i=2;j=5使得这个数变大;很明显当i相同时,a[j]最小的数优先。
我们可以交换 i = 2,j = 4; i=3,j=4; 使得这个数变大;很明显当j相同时,i最大的数优先。
最小的话,找到最优的i,j,把[j+1,n]排个序就好了。
找到规律就可以做了。
class Solution { public: int nextGreaterElement(long long n) { long long a[15], l; stack<int> s; l = 0; while (n) { s.push(n % 10); n /= 10; } while (!s.empty()) { a[l++] = s.top(); s.pop(); } long long ans = 0xffffffff; int lasti = -1, lastj = -1; for (int i = l-1; i >= 0; i--) for (int j = i - 1; j >= 0; j--) { if (a[i] > a[j]) { if (j > lastj) { lasti = i; lastj = j; } else if (j == lastj ) { if (a[i] < a[lasti]) { lasti = i; lastj = j; } } } } if (lasti == -1 && lastj == -1) return -1; //cout << lasti << '\t' << lastj << '\n'; swap(a[lasti],a[lastj]); sort(a+lastj+1,a+l); long long num = 0; for (int i = 0; i < l; i++) num = num * 10 + a[i]; if (num > INT_MAX) return - 1; return num; } };有一个坑,爆int输出的-1!!!!