采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师关于这道题我找到了答案
链接是https://blog.csdn.net/weixin_45380677/article/details/102318050
我不懂的是比如找到下一个排列呢为啥执行这一步呢
比如 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
继续加油!:)
为什么有if (i >= 0) { int j = nums.length - 1; while (j >= 0 && nums[j] <= nums[i]) { j--; } swap(nums, i, j); }; 这个步骤直接取相邻也可以啊
我不确定我是不是理解了你的意思。但是我的理解,你错误的地方在于,找到的第一个升序对,只标明了需要发生改变的位置,不一定就是这个数据对交换就可以。比如 12354,第一对升序对是 35,但是下一个排列是 12435,实际是把 4 放到 3 前面。即从右往前看,第一个比 3 大的数字。请再看一遍我给你的链接的图示。a[i - 1] 和 a[i] 是第一对升序对,但需要交换的是 a[i - 1] 和 a[j]。 如果我还是没有理解你的意思,一个简单的方式是,请你把你心中想的逻辑,用代码表达出来,然后实际去看,这个代码是否是正确的。如果不是正确的,去看具体在哪一个例子发生了问题,然后反向去推,自己的逻辑在这个例子下为什么不适用?自己的逻辑哪里有问题?这是学习算法的重要方式。 继续加油!:)
现在貌似懂了,印象不是很深刻,周末把之前做的算法题自己实现一下
登录后可查看更多问答,登录/注册
课程配套大量BAT面试真题,高频算法题解析,强化训练
1.1k 13
1.2k 12
704 11
1.6k 10
1.2k 10