leetcode 1671

前置题目是300, 对于每个数字, 求得包括其的左递增子序列长度, 和包括其的递减右子列长度, 相加减-即可.

class Solution:
    def calculate_increase_num(self, nums):
        if not nums:
            return nums
        longest_val_list = []
        longest_index_list = []
        lis_list = []

        longest_val_list.append(nums[0])
        longest_index_list.append(0)
        lis_list.append(1)

        for i in range(1, len(nums)):
            val = nums[i]

            if val > longest_val_list[-1]:
                longest_val_list.append(val)
                longest_index_list.append(i)
                lis_list.append(len(longest_val_list))
                continue
            start = 0
            end = len(longest_val_list) - 1
            while start < end:
                mid = (start + end) // 2
                if longest_val_list[mid] >= val:
                    end = mid
                else:
                    start = mid + 1
            longest_val_list[start] = val
            lis_list.append(start + 1)
        return lis_list
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        left_increase_num_list = self.calculate_increase_num(nums)
        right_increase_num_list = self.calculate_increase_num(nums[::-1])[::-1]
        length = 0
        for i in range(len(left_increase_num_list)):
            a = left_increase_num_list[i]
            b = right_increase_num_list[i]
            if a == 1 or b == 1:
                continue
            tmp = a + b - 1
            if tmp > length:
                length = tmp
        result = len(left_increase_num_list) - length
        return result
posted @ 2021-11-22 00:41  茫茫碧落  阅读(24)  评论(0编辑  收藏  举报