标签:排列 end nums int 31 len 力扣 sx swap
class Solution31 { public void nextPermutation(int[] nums) { if (nums == null || nums.length == 0) return; int len = nums.length; // 从后往前找到第一个递增对 int sx = len - 1; for (int i = len - 2; i >= 0; i--) { if (nums[i] < nums[i+1]) { sx = i; break; } } if (sx == len-1) { // 没有找到递增对,说明整个子串是递减的 reverse(nums, 0); } // 在[sx+1, len)区间从后往前找第一个大于nums[sx]的位置 int end = len - 1; for (int i = len - 1; i >= sx+1; i--) { if (nums[i] > nums[sx]) { end = i; break; } } // 交换nums[sx]和nums[end] swap(nums, sx, end); reverse(nums, sx+1); } public void swap(int[] nums, int x, int y) { int temp = nums[x]; nums[x] = nums[y]; nums[y] = temp; } public void reverse(int[] nums, int start) { int l = start; int r = nums.length - 1; while (l < r) { swap(nums, l, r); l++; r--; } } }
简化一下:
class Solution31 { public void nextPermutation(int[] nums) { if (nums == null || nums.length == 0) return; int len = nums.length; int sx = len - 2; while (sx >= 0 && nums[sx] >= nums[sx+1]) sx--; if (sx >= 0) { int end = len-1; while (end >= sx+1 && nums[sx] >= nums[end]) end--; swap(nums, sx, end); } reverse(nums, sx+1); } public void swap(int[] nums, int x, int y) { int temp = nums[x]; nums[x] = nums[y]; nums[y] = temp; } public void reverse(int[] nums, int start) { int l = start; int r = nums.length - 1; while (l < r) { swap(nums, l, r); l++; r--; } } }
标签:排列,end,nums,int,31,len,力扣,sx,swap 来源: https://www.cnblogs.com/xiazhenbin/p/15388910.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。