1671。制作山阵的最少移除次数
难度:难
主题:数组、二分查找、动态规划、贪心
你可能还记得,数组 arr 是一个 山数组 当且仅当:
- arr.length >= 3
- 存在一些索引 i (0-indexed),其中 0
- 我
arr[0]
arr[i]> arr[i 1] > ...>> arr[arr.length - 1]
给定一个整数数组 nums,返回要删除的最小个元素,以使 nums 成为山数组
。示例1:
- 输入: nums = [1,3,1]
- 输出: 0
- 说明: 数组本身就是一个山数组,所以我们不需要删除任何元素。
示例2:
- 输入: nums = [2,1,1,5,6,2,3,1]
- 输出: 3
- 解释: 一种解决方案是删除索引 0、1 和 5 处的元素,使数组 nums = [1,5,6,3,1]。
约束:
- 3 1 9
- 保证你可以用nums制作一个山形数组。
提示:
- 考虑相反的方向而不是最小元素来删除最大山子序列
- 想想 LIS,它有点接近
解决方案:
我们可以使用动态规划方法,其思想是找到最大山子序列,而不是直接计算要删除的元素。这种方法基于为数组中的每个位置找到两个最长递增子序列(LIS):一个为从左到右,另一个为从右到-离开
。一旦我们有了尽可能长的山子序列,原始数组长度和该子序列长度之间的差异将为我们提供要删除的最少元素。解决方案概要
-
识别增加的子序列长度
:- 计算 leftLIS 数组,其中 leftLIS[i] 表示以 i 结尾的最长递增子序列的长度(从左到右)。
-
识别递减的子序列长度
:- 计算rightLIS数组,其中rightLIS[i]表示从i开始(从右到左)的最长递减子序列的长度。
-
计算最大山长:
- 对于每个索引 i,其中 0 1 且 rightLIS[i] > 1)。计算 i 处的山长为 leftLIS[i] rightLIS[i] - 1.
-
获得最小移除量:
- 要删除的最小元素将是原始数组长度减去找到的最长山的长度。
让我们用 PHP 实现这个解决方案:1671。制作山脉阵列的最少移除次数
<?php /** * @param Integer[] $nums * @return Integer */ function minimumMountainRemovals($nums) { ... ... ... /** * go to ./solution.php */ } // Example usage $nums1 = [1, 3, 1]; echo minimumMountainRemovals($nums1); // Output: 0 $nums2 = [2, 1, 1, 5, 6, 2, 3, 1]; echo minimumMountainRemovals($nums2); // Output: 3 ?>
解释:
-
左LIS计算:
- leftLIS[i] 存储以 i 结尾的递增子序列的最大长度。我们迭代每个 i,对于每个 i,从 0 迭代到 i-1,找到以 i 结尾的最长子序列。
-
正确的 LIS 计算:
- rightLIS[i] 存储从 i 开始的递减子序列的最大长度。我们从 n-2 向后迭代到 0,对于每个 i,从 n-1 向下迭代到 i 1 以找到从 i 开始的最长子序列。
-
山脉计算:
- 索引 i 处的有效峰值必须具有 leftLIS[i] > 1 且右LIS[i]> 1. 峰位于 i 的山的长度为 leftLIS[i] rightLIS[i] - 1.
-
最终计算:
- 所需的最小移除量是原始数组长度与找到的最大山体长度之间的差值。
复杂性分析
- 时间复杂度:O(n2),由于LIS计算中的双循环。
- 空间复杂度:O(n),用于存储leftLIS和rightLIS数组。
该解决方案确保我们找到最大的山脉子序列并计算实现山脉阵列所需的最小移除量。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
- 领英
- GitHub
以上是制作山脉阵列的最少移除次数的详细内容。更多信息请关注PHP中文网其他相关文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。