请问完善程序的一般思考思路是什么

img


请问这种问题的一般思考方向是什么样的,可以讲讲这个程序的思考方向和里面的一些要点吗?

其实最简单的方法是“仿写”,比如234空,都可以直接仿写
当你完全不知道这种查找的算法的时候:

  1. 不难看出是在初始化排列P,那么哪个数组是用来存P的?实在看不出来先可以空着,其实从变量命名上可以看出一些端倪,L、R明显是在说方向,那么只剩一个a[N]是用来存P的,那么无非就是两种,一种是a[x] = i,另一种是a[i] = x,猜一个即可
  2. 题目中提到了用的是双向链表,从L[i] = i - 1可以知道,L代表的是前一个节点的位置,那么R就是后一个节点的位置,即R[i] = i + 1
  3. 与4成一对,直接仿写
  4. 与3成一对,直接仿写
  5. 输出,整个操作中,涉及到变动的只有L,R两个数组,不是输出L就是R,猜一个即可

简单说说这题的算法:
朴素算法:每个去遍历,找到更大的则填入,没找到则=n + 1,模拟一遍即可。
优化算法:有没有什么办法能瞬间找到比一个数大的那个数在哪?其实很简单,只要让数列有序即可。那么就先预处理一遍数列{1,5,4,3,2} - > {1,2,3,4,5},当然,直接排序就会失去原先的位置信息,我们需要记录原先的位置,从题目中来看,值和位置信息都是1-n,则可以直接用索引作为P的值,数组的值作为位置信息a[x] = i(第一个for)。有了位置信息和排序后的P,用L、R来维护双链表的指针(第二个for)。下面只要对每次最小的值进行删除即可(第三个for),这里就不展开讲了,有兴趣可以去搜一下。全部处理完后的结果就是R(第四个for)