• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
不会投篮的邢
投篮三不沾
博客园    首页    新随笔    联系   管理    订阅  订阅

31. 下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

 

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:

输入:nums = [1]
输出:[1]
 

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 100
通过次数186,682提交次数501,832

例如

123456 

123465

123546

........

首先需要从右往左找到相邻的逆序数字(从右往左看为逆序),使用i,j作为下标,因为当我们变换为字典序的下一个数字时需要把i,j位置上的数字变为正序,再从nums的尾部end到j遍历数组,当nums[end]>nums[i]时交换这两个数字(此举是为了查找i位置上的下一个数字),最后将i+1到end位置上的数据从小到大排列即可。

import java.util.Arrays;

public class Code_31 {
    public static void main(String[] args) {
        int i = 0;
        for (i = nums.length - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]) {
                //再逆序查找,第一个比刚才大的数字进行交换
                for (int j = nums.length - 1; j > i; j--) {
                    if (nums[j] > nums[i]) {
                        int temp = nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                        Arrays.sort(nums, i + 1, nums.length - 1);
                        return;
                    }
                }
            }
        }
        Arrays.sort(nums);
    }
}

  

posted @ 2021-07-22 23:24  不会投篮的邢  阅读(50)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3