请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

leetcode 下一个排列问题

老师关于这道题我找到了答案

https://img1.sycdn.imooc.com//szimg/6177a8e00986a2ba10070632.jpg

链接是https://blog.csdn.net/weixin_45380677/article/details/102318050

我不懂的是比如找到下一个排列呢为啥执行这一步呢https://img1.sycdn.imooc.com//szimg/6177a934092b9cc606480072.jpg

正在回答

插入代码

1回答

比如 3 4 5 2 1


从右找到第一对升序:4 5 以后,将 4,5 交换位置,变成 3 5 4 2 1。


3 5 4 2 1 不是解,之后,我们要把 4 2 1 反序,也就是得到 3 5 开头的第一个序列,即 3 5 1 2 4。


你可以再多找一些例子模拟一下,实际理解一下整个算法的每一步在做什么。


另外,你连接的这篇文章我觉得思路写的不够清晰,这篇文章可能更好:https://zhuanlan.zhihu.com/p/45007701


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉3884565 #1
    为什么有if (i >= 0) {
                int j = nums.length - 1;
                while (j >= 0 && nums[j] <= nums[i]) {
                    j--;
                }
                swap(nums, i, j);
            };
    这个步骤直接取相邻也可以啊
    回复 有任何疑惑可以回复我~ 2021-10-27 10:50:33
  • liuyubobobo 回复 提问者 慕粉3884565 #2
    我不确定我是不是理解了你的意思。但是我的理解,你错误的地方在于,找到的第一个升序对,只标明了需要发生改变的位置,不一定就是这个数据对交换就可以。比如 12354,第一对升序对是 35,但是下一个排列是 12435,实际是把 4 放到 3 前面。即从右往前看,第一个比 3 大的数字。请再看一遍我给你的链接的图示。a[i - 1] 和 a[i] 是第一对升序对,但需要交换的是 a[i - 1] 和 a[j]。
    
    如果我还是没有理解你的意思,一个简单的方式是,请你把你心中想的逻辑,用代码表达出来,然后实际去看,这个代码是否是正确的。如果不是正确的,去看具体在哪一个例子发生了问题,然后反向去推,自己的逻辑在这个例子下为什么不适用?自己的逻辑哪里有问题?这是学习算法的重要方式。
    
    继续加油!:)
    回复 有任何疑惑可以回复我~ 2021-10-27 11:16:49
  • 提问者 慕粉3884565 回复 liuyubobobo #3
    现在貌似懂了,印象不是很深刻,周末把之前做的算法题自己实现一下
    回复 有任何疑惑可以回复我~ 2021-10-28 11:32:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信