import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cows int整型一维数组 * @return int整型一维数组 */ public int[] nextPermutation(int[] cows) { // 初始化指针 i,指向倒数第二个元素 int i = cows.length - 2; // 找到从右往左第一个不满足递增条件的元素索引 i while (i >= 0 && cows[i] <= cows[i + 1]) { i--; } // 如果存在满足递增条件的元素 if (i >= 0) { // 找到从右往左第一个大于元素 cows[i] 的元素索引 j int j = cows.length - 1; while (j >= 0 && cows[i] <= cows[j]) { j--; } // 交换元素 cows[i] 和 cows[j] swap(cows, i, j); } // 对剩余部分进行反转,使其成为最小的字典序 reverse(cows, i + 1, cows.length - 1); return cows; } // 交换数组中元素的位置 private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } // 反转数组的某个区间 private void reverse(int[] nums, int start, int end) { while (start < end) { // 交换 start 和 end 处的元素 swap(nums, start, end); start++; end--; } } }
本题知识点分析:
1.数组遍历
2.数学模拟
3.字符串的翻转类似
本题解题思路分析:
1.找到从右往左第一个不满足递增条件的元素索引 i
2.如果存在满足递增条件的元素
3.找到从右往左第一个大于元素 cows[i] 的元素索引 j
4.进行元素交换
5.对剩余部分进行翻转,变成最小的字典序