← 返回目录

算法笔试模拟题精解之“连绵的群山”

第 23 / 74 卷日期:

算法笔试模拟题精解之“连绵的群山”

贡献者 | 张鹏飞

简介:可以将山化分为几个小连续区间,每个区间保证越来越高,并且保证每个

区间尽可能的长。除第一个和最后一个区间,中间的其余区间,有移除可能的是每个

区间的最小值和最大值,第一个区间有移除可能的是最小值,最后一个区间有移除可

能的是最大值。这样才能找出最长的山的区间。

题目描述

等级:中等

知识点:DP

查看题目:连绵的群山

小森家的北面有一条连绵的山脉,山脉高低起伏。小森很好奇这些山中最多有几

座连续的山头是越来越高的,当然这对小森来说太简单了。

他又想,假如可以移除其中一座,这个答案最大又会是多少?当然了,他也可以

选择不移除任何一座山峰。1 <= n <= 100000, 1 <= a[i] <= 1000000000。

输入内容为两行,第一行为山峰的数量 n,第二行为 n 个数字,表示每个山头的

高度。

输出一个数字,表示最大值。

示例 1

输入:

[5,10,6,7,8]

输出:

4

注意

可以去掉 10,形成数组 [5, 6, 7, 8],长度为 3。

解题思路:

大致思路:可以将山化分为几个小连续区间,每个区间保证越来越高,并且保证

每个区间尽可能的长。除第一个和最后一个区间,中间的其余区间,有移除可能的是

每个区间的最小值和最大值,第一个区间有移除可能的是最小值,最后一个区间有移

除可能的是最大值。这样才能找出最长的山的区间。

具体过程:初始化两个数组,oneIndex 和 arr,arr 保存当前增区间的长度,

oneIndex 保存 arr 中数组元素为 1 的索引位置,对于 [5,10,6,7,8] 例子,arr={1,2,1,2,3}

(5,10 递增,6,7,8 为一个增区间 ),oneIndex={0, 2}(因为 arr[0]=1,arr[2]=1)。

这下明白这两个数组的含义了吧。

接下来遍历 oneIndex 区间,也就是找出 arr 中所有为 1 的值的索引(arr 数组

的存在可以不用遍历 arr 找 1 的位置,而是可以直接定位,用空间换时间 )

所有为 1 的值的索引的元素 ( 除第一个 1)和其前面的那个元素都有移除的嫌疑,

移除后计算长度。

先移除 1 前面那座山,也就是上一个区间最高的山

if(a[oneIndex[i]-2]<=a[oneIndex[i]])

ans=Math.max(arr[oneIndex[i+1]-1]+arr[oneIndex[i]-2],ans);

Else ans=Math.max(arr[oneIndex[i]-1],ans);

再移除 1 这座山,也就是当前区间最低的山 ( 有同学可以不明白为什么最低的山

也有移除的可能性 , 看看下面的例子 )

可能出现这种情况

2,4,5,6,3,8,9,11,13,15

这样的话,即使 3 是第二个区间中最小的,也应该移除,因为这个区间的其他数

字都很大,而且可以和前面的区间对接上。

if(oneIndex[i]+1<n) { if(a[oneIndex[i]-1]<=a[oneIndex[i]+1])

ans=Math.max(arr[oneIndex[i+1]-1]+arr[oneIndex[i]-1]-1,ans);

Else ans=Math.max(arr[oneIndex[i]-1],ans);

}

看完之后是不是有了想法了呢,快来练练手吧 >> 查看题目:连绵的群山

全站分卷索引 · 74 卷
  1. 1一、算法思想
  2. 2算法笔试模拟题精解之“打怪兽”
  3. 31.2 贪心
  4. 4算法笔试模拟题精解之“最强的团队”
  5. 5算法笔试模拟题精解之“Tom 爱吃巧克力”
  6. 6算法笔试模拟题精解之“吃奶酪”
  7. 7算法笔试模拟题精解之“一的个数”
  8. 8算法笔试模拟题精解之“Bob 的花束”
  9. 9算法笔试模拟题精解之“钱庄”
  10. 10算法笔试模拟题精解之“移动射击”
  11. 11算法笔试模拟题精解之“相似数组”
  12. 12算法笔试模拟题精解之“过吊桥”
  13. 13算法笔试模拟题精解之“完美排列”
  14. 14算法笔试模拟题精解之“采摘圣诞果”
  15. 15算法比赛模拟题精解之“Tairitsu and Dynamic Objects”
  16. 16算法笔试模拟题精解之“Codancer 的炸弹引爆”
  17. 17算法笔试模拟题精解之“学习小组”
  18. 18算法笔试模拟题精解之“恢复字符串”
  19. 191.3 DP/ 动态规划
  20. 20算法笔试模拟题精解之“寻找等比数列”
  21. 21算法笔试模拟题精解之“字符配对”
  22. 22算法笔试模拟题精解之“数组染色”
  23. 23算法笔试模拟题精解之“连绵的群山”
  24. 24算法笔试模拟题精解之“难住Tom 的问题”
  25. 25算法笔试模拟题精解之“变化的字符”
  26. 26算法笔试模拟题精解之“跳房子”
  27. 27算法笔试模拟题精解之“寒假活动”
  28. 28算法笔试模拟题精解之“最短路”
  29. 29算法笔试模拟题精解之“codancer 上楼”
  30. 30算法笔试模拟题精解之“木棒拼接”
  31. 31算法笔试模拟题精解之“Codancer 的数组封印”
  32. 32算法笔试模拟题精解之“Jerry 的异或运算”
  33. 33算法笔试模拟题精解之“小明的数学作业”
  34. 34算法笔试模拟题精解之“奇偶数列”
  35. 351.4 剪枝
  36. 361.5 尺取法
  37. 37算法笔试模拟题精解之“调整数组”
  38. 38算法笔试模拟题精解之“最优分组”
  39. 39算法笔试模拟题精解之“破译密码”
  40. 40二、数据结构
  41. 412.2 搜索
  42. 42算法笔试模拟题精解之“能量半径”
  43. 43算法笔试模拟题精解之“苹果收获程序”
  44. 44算法笔试模拟题精解之“恐怖的辐射”
  45. 45算法笔试模拟题精解之“树的拆分”
  46. 46算法笔试模拟题精解之“Password”
  47. 47算法笔试模拟题精解之“神奇数字在哪里”
  48. 48算法笔试模拟题精解之“神奇的棋子”
  49. 492.3 树
  50. 50算法笔试模拟题精解之“Codancer 的旅行”
  51. 51算法笔试模拟题精解之“Codancer 的求和”
  52. 52算法笔试模拟题精解之“找出二叉搜索树的第2 大的数”
  53. 532.4 线型
  54. 54算法笔试模拟题精解之“最活跃的数”
  55. 55算法笔试模拟题精解之“非递减序列”
  56. 56算法笔试模拟题精解之“Tom 跳方格”
  57. 57算法笔试模拟题精解之“复杂的字符串”
  58. 58算法笔试模拟题精解之“神秘消失”
  59. 59三、计算
  60. 60算法笔试模拟题精解之“简单题?
  61. 61算法笔试模拟题精解之“朋友一生一起走”
  62. 62算法笔试模拟题精解之“正三角塔”
  63. 63算法笔试模拟题精解之“组队难题”
  64. 64算法笔试模拟题精解之“2n 合体”
  65. 65算法笔试模拟题精解之“平行线”
  66. 66算法笔试模拟题精解之“叠叠高”
  67. 67算法笔试模拟题精解之“公平”
  68. 68算法笔试模拟题精解之“Tom 的手工课”
  69. 69算法笔试模拟题精解之“填数问题”
  70. 70算法笔试模拟题精解之“Jerry 的考验”
  71. 71算法笔试模拟题精解之“超车”
  72. 72算法笔试模拟题精解之“坏掉的时钟”
  73. 73算法笔试模拟题精解之“期末考试”
  74. 74算法笔试模拟题精解之“滑雪比赛”