1
+ minimumMountainRemovals <- function (nums ) {
2
+ n <- length(nums )
3
+
4
+ # Calculate LIS from the left side
5
+ left_lis <- integer(n )
6
+ temp <- c()
7
+ for (i in 1 : n ) {
8
+ pos <- findInterval(nums [i ], temp , left.open = TRUE ) + 1
9
+ if (pos > length(temp )) {
10
+ temp <- c(temp , nums [i ])
11
+ } else {
12
+ temp [pos ] <- nums [i ]
13
+ }
14
+ left_lis [i ] <- pos
15
+ }
16
+
17
+ # Calculate LIS from the right side (for LDS)
18
+ right_lis <- integer(n )
19
+ temp <- c()
20
+ for (i in n : 1 ) {
21
+ pos <- findInterval(nums [i ], temp , left.open = TRUE ) + 1
22
+ if (pos > length(temp )) {
23
+ temp <- c(temp , nums [i ])
24
+ } else {
25
+ temp [pos ] <- nums [i ]
26
+ }
27
+ right_lis [i ] <- pos
28
+ }
29
+
30
+ # Calculate the maximum mountain length
31
+ max_mountain <- 0
32
+ for (i in 2 : (n - 1 )) {
33
+ if (left_lis [i ] > = 2 && right_lis [i ] > = 2 ) {
34
+ max_mountain <- max(max_mountain , left_lis [i ] + right_lis [i ] - 1 )
35
+ }
36
+ }
37
+
38
+ # Return minimum elements to remove
39
+ if (max_mountain > 0 ) {
40
+ return (n - max_mountain )
41
+ } else {
42
+ return (n )
43
+ }
44
+ }
45
+
46
+ # Example usage
47
+ nums1 <- c(1 , 3 , 1 )
48
+ nums2 <- c(2 ,1 ,1 ,5 ,6 ,2 ,3 ,1 )
49
+ nums3 <- c(100 ,92 ,89 ,77 ,74 ,66 ,64 ,66 ,64 )
50
+ print(minimumMountainRemovals(nums1 )) # Output: 0
51
+ print(minimumMountainRemovals(nums2 ))
52
+ print(minimumMountainRemovals(nums3 ))
0 commit comments