1. `import`
2. `java.util.`
3. `Scanner;`
4. `publicclass`
5. `Main`
6. `{`
7. `publicstaticvoid`
8. `main(String[] args)`
9. `{`
10. `Scanner`
11. `scanner = new`
12. `Scanner(System.in);`
13. `int`
14. `length = scanner.nextInt();`
15. `int[] arrays = newint[length];`
16. `for(int i = 0; i < length; i++)`
17. `{`
18. `arrays[i] = scanner.nextInt();`
19. `}`
20. `/**`
22. `* sum 总距离`
24. `* repetition 三个节点 中被重复计算的总距离`
26. `* select 优化距离最大的 三个节点两两相加的距离`
28. `* add 三个结尾距离为 max 中 头尾节点的距离`
30. `* last 最后三个节点中 尾距离没有被计算两次 需要加上`
32. `* optimizeDistance 优化距离`
34. `*/`
35. `int`
36. `sum = 0,`
37. `int`
38. `repetition = 0,`
39. `intselect = 0,`
40. `int`
41. `add = 0,`
42. `intlast = 0,`
43. `int`
44. `optimizeDistance = 0;`
45. `for(int i = 0; i <= (arrays.length - 3); i++)`
46. `{`
47. `intbegin = arrays[i];`
48. `int`
49. `mid = arrays[i + 1];`
50. `intend = arrays[i + 2];`
51. `//三个点之间的距离`
52. `int`
53. `threePointDistance = Math.abs(mid - begin) + Math.abs(end - mid);`
54. `//两个点之间的距离 即被多次计算待会需要减掉的距离`
55. `int`
56. `twoPointDistance = Math.abs(end - mid);`
57. `int`
58. `contrast = threePointDistance - Math.abs(begin - end);`
59. `repetition += twoPointDistance;`
60. `sum += threePointDistance;`
61. `last = twoPointDistance;`
62. `if(contrast > optimizeDistance)`
63. `{`
64. `optimizeDistance = contrast;`
65. `select = threePointDistance;`
66. `add = Math.abs(end - begin);`
67. `}`
68. `}`
69. `System.`
70. `out.println((sum - select + last) - repetition + add);`
71. `}`
72. `}`
</pre>
3、度度熊最近对全排列特别感兴趣,对于 1 到 n 的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 ‘>’ 和 ‘<’ )使其成为一个合法的不等式数列。
但是现在度度熊手中只有 k 个小于符号即(’<’’)和 n-k-1 个大于符号(即’>’),度度熊想知道对于 1 至n 任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。
解答:
dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) % 2017;
dp[i][j]表示有 i 个数字及 j 个小于号所能组成的数量(大于号数量当然是 i - j - 1 次,后面需要使用)
而加入第 i + 1 个数字时,分以下四种情况:
-
如果将 i+1 插入当前序列的开头,即有了 1<2,加入后成为 3>1<2,会发现等于同时加入了一个大于号!(此时可以无视 1 与 2 之间的关系,因为 i+1>i)
-
如果将 i+1 插入当前序列末尾,即 1<2 变成了 1<2<3,会发现等于同时加入了一个小于号!(此时可以无视 1 与 2 之间的关系,因为 i+1>i)
-
如果将i+1加入一个小于号之间,即已经有 1<2了,向中间加入3,会发现变成了1<3>2,等于同时加入了一个大于号!
-
如果将 i+1 加入一个大于号中间,即有了 2>1,变成了 2<3>1,等于同时加入了一个小于号!
综上所述,dp[i][j]等于以上四种情况之和:
dp[i - 1][j] 将 i 加在开头等于加入一个大于号,即要求 i-1 个数时已经有了 j 个小于号;
dp[i - 1][j - 1] 将 i 加在末尾等于加入一个小于号,即要求 i-1 个数时已经有了 j-1 个小于号;
dp[i - 1][j] * j 将 i 加在任意一个小于号之间,等于加入了一个大于号,即要求 i-1 个数时已经有了 j 个小于号,每个小于号都可以进行这样的一次插入;
dp[i - 1][j - 1] * (i- j - 1) 将 i 加载任意一个大于号之间,等于加入了一个小于号,即要求i-1 个数时有了 j-1 个小于号;
而此时共有(i - 1) - (j - 1)- 1 个大于号,每个大于号都要进行一次这样的操作合并同类项即为dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1))。
最后要记得取模。
…
由于篇幅原因,我就不一一给大家展示了,需要这套算法面试题的可以跳到文章末尾哦!
于是,我被老大叫去办公室喝茶,然后,就离职了…
OS:你TM裁员就裁员,突击测试算怎么回事?
算法课程的具体内容:
还有视频目录:
最后
这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香,下载请点击这里)
伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香,下载请点击这里)
[外链图片转存中…(img-vbT7s58J-1628225999903)]
[外链图片转存中…(img-Nr36sUrG-1628225999904)]