1053:交换一次的先前排列
This commit is contained in:
parent
e3696d1972
commit
1c8185c292
@ -0,0 +1,73 @@
|
|||||||
|
////给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的、按字典序排列小于
|
||||||
|
//arr 的最大排列。
|
||||||
|
//
|
||||||
|
// 如果无法这么操作,就请返回原数组。
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// 示例 1:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//输入:arr = [3,2,1]
|
||||||
|
//输出:[3,1,2]
|
||||||
|
//解释:交换 2 和 1
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// 示例 2:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//输入:arr = [1,1,5]
|
||||||
|
//输出:[1,1,5]
|
||||||
|
//解释:已经是最小排列
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// 示例 3:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//输入:arr = [1,9,4,6,7]
|
||||||
|
//输出:[1,7,4,6,9]
|
||||||
|
//解释:交换 9 和 7
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// 提示:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// 1 <= arr.length <= 10⁴
|
||||||
|
// 1 <= arr[i] <= 10⁴
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Related Topics 贪心 数组 👍 117 👎 0
|
||||||
|
|
||||||
|
|
||||||
|
package leetcode.editor.cn;
|
||||||
|
|
||||||
|
// 1053:交换一次的先前排列
|
||||||
|
public class PreviousPermutationWithOneSwap {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Solution solution = new PreviousPermutationWithOneSwap().new Solution();
|
||||||
|
}
|
||||||
|
|
||||||
|
//leetcode submit region begin(Prohibit modification and deletion)
|
||||||
|
class Solution {
|
||||||
|
public int[] prevPermOpt1(int[] arr) {
|
||||||
|
int size = arr.length;
|
||||||
|
for (int i = size - 1; i > 0; i--) {
|
||||||
|
if (arr[i] < arr[i - 1]) {
|
||||||
|
int j = size - 1;
|
||||||
|
while (arr[j] >= arr[i - 1] || arr[j] == arr[j - 1]) {
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
int tmp = arr[i - 1];
|
||||||
|
arr[i - 1] = arr[j];
|
||||||
|
arr[j] = tmp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//leetcode submit region end(Prohibit modification and deletion)
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<p>给你一个正整数数组 <code>arr</code>(可能存在重复的元素),请你返回可在 <strong>一次交换</strong>(交换两数字 <code>arr[i]</code> 和 <code>arr[j]</code> 的位置)后得到的、按字典序排列小于 <code>arr</code> 的最大排列。</p>
|
||||||
|
|
||||||
|
<p>如果无法这么操作,就请返回原数组。</p>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<p><strong>示例 1:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>arr = [3,2,1]
|
||||||
|
<strong>输出:</strong>[3,1,2]
|
||||||
|
<strong>解释:</strong>交换 2 和 1
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p><strong>示例 2:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>arr = [1,1,5]
|
||||||
|
<strong>输出:</strong>[1,1,5]
|
||||||
|
<strong>解释:</strong>已经是最小排列
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p><strong>示例 3:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>arr = [1,9,4,6,7]
|
||||||
|
<strong>输出:</strong>[1,7,4,6,9]
|
||||||
|
<strong>解释:</strong>交换 9 和 7
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<p><strong>提示:</strong></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><code>1 <= arr.length <= 10<sup>4</sup></code></li>
|
||||||
|
<li><code>1 <= arr[i] <= 10<sup>4</sup></code></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div><div>Related Topics</div><div><li>贪心</li><li>数组</li></div></div><br><div><li>👍 117</li><li>👎 0</li></div>
|
Loading…
Reference in New Issue
Block a user