C++單調向量算法:得到山形數組的最少刪除次數

本題的其它解法

C++二分算法:得到山形數組的最少刪除次數

題目

我們定義 arr 是 山形數組 當且僅當它滿足:
arr.length >= 3
存在某個下標 i (從 0 開始) 滿足 0 < i < arr.length - 1 且:
arr[0] < arr[1] < … < arr[i - 1] < arr[i]
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 的元素刪除,剩余元素為 [1,5,6,3,1] ,是山形數組。
參數范圍
3 <= nums.length <= 1000
1 <= nums[i] <= 109
題目保證 nums 刪除一些元素后一定能得到山形數組。

分析

本題可以轉換成:最長山形數組,再進一步轉換成最長升序子序列。

時間復雜度

時間復雜度O(nlogn)。分兩步:一,尋找左半部分。二,尋找右半部分。每步枚舉每個山頂,時間復雜度O(n),每個山頂二分查找一次,時間復雜度O(logn)。

vLenToMin

vLenToMin[i]的含義是 長度為i+1 的子序列 的結尾,如果有多個符合的子序列,取結尾最小的。
比如:

原始數組vLenToMin
11
1 2{1}->{1,2}
2 1{2}->{1}
1 2 3{1}->{1,2
1 3 3 4 5{1}->{1,3}->{1,3,4}->{1,3,4,5}
1 3 5 4{1}->{1,3}->{1,3,5}->{1,3,4}

總結

一,只會在尾部增加元素。不會在其它位置增加元素。
二,不會刪除元素。
三,會替換元素。
四,嚴格遞增。
五,所有的數都小于當前值時,在末尾增加,顯然是升序。
六,it第一個大于等于n的迭代器,之前的元素一定嚴格小于it,而it<=n,故前面元素一定小于n。
后面的元素不會ij等于it,否則它就是*it。[ii,…)都大于等于n,所有ij不會小于n。
七,規則五和六保證了vLenToMin永遠嚴格遞增。

代碼

核心代碼

class Solution {
public:int minimumMountainRemovals(vector<int>& nums) {vector<int> vLeftLen,vRightLen;Do(vLeftLen, nums);Do(vRightLen, vector<int>(nums.rbegin(), nums.rend()));std::reverse(vRightLen.begin(), vRightLen.end());int iMaxLen = 0;for (int i = 1; i+1 < nums.size(); i++){if ((vLeftLen[i] > 1) && (vRightLen[i] > 1)){iMaxLen = max(iMaxLen, vLeftLen[i] + vRightLen[i] - 1);}}return nums.size() - iMaxLen;}void Do(vector<int>& vLen, const vector<int> nums){vector<int> vLenToMin;//vLenToMin[i]的含義是 長度為i+1 的子序列 的結尾,如果有多個符合的子序列,取結尾最小的。for (const auto& n : nums){auto it = std::lower_bound(vLenToMin.begin(), vLenToMin.end(), n);vLen.emplace_back(it - vLenToMin.begin() + 1);if (vLenToMin.end() == it){vLenToMin.emplace_back(n);}else{if (n < *it){*it = n;}}}}
};

測試用例

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
Assert(v1[i], v2[i]);
}
}

int main()
{
vector nums;
int res;
{
Solution slu;
nums = { 1,3,1 };
res = slu.minimumMountainRemovals(nums);
Assert(0, res);
}
{
Solution slu;
nums = { 2, 1, 1, 5, 6, 2, 3, 1 };
res = slu.minimumMountainRemovals(nums);
Assert(3, res);
}
{
Solution slu;
nums = { 9, 8, 1, 7, 6, 5, 4, 3, 2, 1 };
res = slu.minimumMountainRemovals(nums);
Assert(2, res);
}
{
Solution slu;
nums = { 100, 92, 89, 77, 74, 66, 64, 66, 64 };
res = slu.minimumMountainRemovals(nums);
Assert(6, res);
}
{
Solution slu;
nums = { 1, 2, 1, 3, 4, 4 };
res = slu.minimumMountainRemovals(nums);
Assert(3, res);
}

//CConsole::Out(res);

}

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DevOps 事后分析

眾所周知&#xff0c;系統的變化會帶來不穩定&#xff0c;進而引發事故。遷移到 DevOps 使世界各地的組織能夠以更小的增量和更高的頻率進行發布。這降低了特定版本中失敗的風險。另一方面&#xff0c;增加發布數量并不一定會減少待命團隊需要響應的事件數量。 事件響應團隊的…

2023.11.22 homework

七年級數學 五年級數學 也不知道可以教到幾年級&#xff0c;估計很快就教不動了。人生啊。

讀像火箭科學家一樣思考筆記06_初學者之心

1. 專業化是目前流行的趨勢 1.1. 通才&#xff08;generalist&#xff09;是指博而不精之人 1.2. 懂得的手藝越多&#xff0c;反而會家徒四壁 1.2.1. 希臘諺語 1.3. 這種態度代價很大&#xff0c;它阻斷了不同學科思想的交融 2. 組合游戲 2.1. 某個行業的變革可能始于另一…

Pycharm的程序調試

有如下代碼需要進行調試&#xff1a; i 1 while i < 10:print(i)步驟一&#xff1a;設置斷點 步驟二&#xff1a;進入調試視圖 方式1&#xff1a;右鍵單擊編輯區&#xff1a;點擊’Debug模塊名’ ? 方式2&#xff1a;ShiftF9 ? 方式3&#xff1a;單機工具欄上的調試按鈕…

Django報錯:RuntimeError at /home/ 解決辦法

錯誤提示&#xff1a; RuntimeError at /home/ Model class django.contrib.contenttypes.models.ContentType doesnt declare an explicit app_label and isnt in an application in INSTALLED_APPS. 原因剖析&#xff1a; 博主在使用pycharm創建Django項目的時候&#xff0…

vector的簡單模擬實現_C++

目錄 一、vector的數據結構 二、vector的構造 三、vector的增刪查改及空間管理 四、全部代碼 一、vector的數據結構 vector以線性連續空間為基礎來定義數據結構以及擴展功能。vector的兩個迭代器&#xff0c;分別是start和finish&#xff0c;分別指向配置得來的已被使用的空…

網絡滲透測試(wireshark 抓取QQ圖片)

1.打開wireshark 這里我用的wifi連接 所以點開wifi就好 打開wifi之后就開始在本機上進行抓包了 我們先給我們的QQ發送一張圖片&#xff0c;用自己的手機發送給電腦 然后點擊左上角的正方形&#xff0c;停止捕獲抓包 QQ的關鍵詞是oicq&#xff0c;所以我們直接找 打開oicq …

十二、h.264解碼

前言 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12 完整代碼&#xff1a; H264DncodeThread.h #ifndef H264DNCODETHREAD_H #define H264DNCODETHREAD_H#include <QObject> #include <QThread>extern "C" { #include <libavu…

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks 論文閱讀筆記論文信息摘要背景方法結果額外 關鍵發現作者動機相關工作1. 使用輸入和編輯圖像的對齊和詳細描述來執行特定的編輯2. 另一類圖像編輯模型采用輸入掩碼作為附加輸入 。3. 為…

鴻蒙4.0開發筆記之ArkTs語言基礎與基本組件結構(四)

文章聲明&#xff1a;本文關于HarmonyOS系統的部分內容和描述借鑒于華為官網的“HarmonyOS開發者學堂”&#xff0c;有需要的也可以進入官網查看。<HarmonyOS第一課>ArkTS開發語言介紹 一、ArkTs語言介紹 ArkTS是鴻蒙系統&#xff08;HarmonyOS&#xff09;優選的主力應…

設計模式-創建型模式-工廠方法模式

一、什么是工廠方法模式 工廠模式又稱工廠方法模式&#xff0c;是一種創建型設計模式&#xff0c;其在父類中提供一個創建對象的方法&#xff0c; 允許子類決定實例化對象的類型。工廠方法模式是目標是定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類中。…

解讀可解釋性機器學習:理解解釋性基準模型(EBM)

解讀可解釋性機器學習&#xff1a;理解解釋性基準模型&#xff08;EBM&#xff09; 近年來&#xff0c;隨著機器學習模型的復雜性不斷增加&#xff0c;研究人員和從業者對模型的可解釋性提出了更高的要求。可解釋性機器學習&#xff08;Explainable Machine Learning, XAI&…

SHAP - 機器學習模型可解釋性工具

github地址&#xff1a;shap/docs/index.rst at master shap/shap (github.com) SHAP使用文檔&#xff1a;歡迎使用 SHAP 文檔 — SHAP 最新文檔 SHAP介紹 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一種用于解釋預測結果的方法&#xff0c;它基于Shapley…

實現el-input-number數字框帶單位

實現的效果展示&#xff0c;可以是前綴單位&#xff0c;也可以是后綴單位。實現的思路就是動態修改偽元素 ::before 和 ::after 的 content值 實現二次封裝數字框的代碼如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…

opencv-直方圖

直方圖是一種對圖像亮度分布的統計表示&#xff0c;它顯示了圖像中每個灰度級別的像素數量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函數計算直方圖。 以下是一個簡單的示例&#xff0c;演示如何計算和繪制圖像的直方圖&#xff1a; import cv2 import numpy as np …

【C++容器】優先級隊列 仿函數 反向迭代器

優先級隊列&#xff0c;仿函數&#xff0c;反向迭代器 優先級隊列認識優先級隊列模擬實現優先級隊列 淺談仿函數仿函數的大致了解仿函數的實現 反向迭代器什么是反向迭代器&#xff1f;反向迭代器的實現 結語 優先級隊列 認識優先級隊列 優先級隊列&#xff08;priority_queue…

Doris分區與分桶(八)

接上篇----------Doris 建表示例 Doris 支持兩層的數據劃分。第一層是 Partition&#xff0c;支持 Range 和 List 的劃分方式。第二層是 Bucket&#xff08;Tablet&#xff09;&#xff0c;僅支持 Hash 的劃分方式。 也可以僅使用一層分區。使用一層分區時&#xff0c;只支持…

低成本打造便攜式無線網絡攻防學習環境

1.摘要 一直以來, 無線網絡安全問題與大眾的個人隱私息息相關, 例如: 為了節省流量, 連接到一個看似安全的免費WiFi, 在使用過程中泄露自己的各類密碼信息甚至銀行卡賬號密碼信息。隨著家用智能電器的普及, 家中的各類智能設備連入家里的無線網絡, 卻突然失靈, 甚至無法正常連…

模擬Spring源碼思想,手寫源碼,理解注解

1、BeanDefinition package com.csdn.myspring; import lombok.AllArgsConstructor; import lombok.Data; Data AllArgsConstructor public class BeanDefinition {private String beanName;private Class beanClass; }2、掃描包的工具類MyTools package com.csdn.myspring; im…

@Scheduled注解 定時任務講解

用于在Java Spring框架中定時執行特定任務的注解 Scheduled&#xff0c;它能夠指定方法在特定時間間隔或特定時間點執行。默認參數是cron&#xff0c;cron參數被用來定義一個Cron表達式&#xff0c;它代表了任務執行的時間規則 參數如下 Cron 這是是一種時間表達式&#xff…