【C++】 —— 筆試刷題day_29

一、排序子序列

題目解析

在這里插入圖片描述

一個數組的連續子序列,如果這個子序列是非遞增或者非遞減的;這個連續的子序列就是排序子序列。

現在給定一個數組,然后然我們判斷這個子序列可以劃分成多少個排序子序列。

例如:1 2 3 2 2 1 可以劃分成 1 2 32 2 1兩個排序子序列

算法思路

對于這道題,思路就很簡單了:

暴力解法

0位置開始遍歷,尋找一段連續子序列,直到這一段子序列不滿足排序子序列的條件,即找到了一個排序子序列;

然后繼續從上次遍歷結束位置接著遍歷數組,尋找下一個子序列。

貪心優化:

當我們遍歷到數組中數值相同的區域時,我們要知道,要找的子序列是非遞增或者非遞減的;

所以這一段相等的序列,我們可以加到前面或者后面的任意序列中。

所以我們在遇到數值相等的子序列時,繼續向后遍歷即可。

但是這樣我們會發現兩個問題:

  1. 如果數組剛開始位置的數據是相等的,我們不知道這段子序列是非遞增的還是非遞減的;
  2. 我們在遍歷過程中會用到下一個位置的值來判斷是非遞增還是非遞減,那最后一個位置該怎么辦?

對于數組開頭的相等子序列,我們可以直接跳過,因為這一段相等的序列可以加到后面的子序列中;

而對于最后一個位置,如果它不能和前面序列組成一個排序子序列,那就只能讓它自己組成一個排序子序列了。

在這里插入圖片描述

代碼實現

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int arr[N];
int n;
int main() {cin >> n;for (int i = 0; i < n; i++)  cin >> arr[i];int ret = 0;for (int i = 0; i < n; i++) {if (i == n - 1) { //數組最后一個位置ret++;break;}if (arr[i] < arr[i + 1]) {//非遞增while (i < n && arr[i] <= arr[i + 1])i++;ret++;} else if (arr[i] > arr[i + 1]) {//非遞減while (i < n && arr[i] >= arr[i + 1])i++;ret++;} else {//數組開始位置的相等子序列while (i < n && arr[i] == arr[i + 1])i++;}}cout << ret << endl;return 0;
}

二、消減整數

題目解析

在這里插入圖片描述

這道題給定一個正整數H,然后從1開始減,第一次減去1,之后每一次減去的數要么和上一次相等,要么是上一次的兩倍;

簡單來說就是:h每次減去一個數,x起始是1;之后每一h減去x或者2*xx表示上次減去的數)。

現在,最少需要幾次才能將h減到0

算法思路

對于這道題,暴力解法

h每次減去x或者2*x,讓它一值減,直到h減到0或者<0

簡單來說就是分情況討論:第一次減去1,之后分別考慮減去x和減去2*x的情況。

這樣時間復雜度和空間復雜度都太大了;并且h每一次減也不一定會恰好等于0

貪心優化:

這道題要我們求的是將x減到0的最少次數;

那如果我們的h減去某一個數是無法減到0的,那我們就不用去考慮它了;

所以,我們現在要考慮的是,h減的過程中,減去x能否減到0;減去2*x能否減到0

這個也非常容易判斷了,如果hx的整數倍,那減去x就肯定可以減到0;如果h2*x的整數倍,那減去2*x就也能減到0

現在有一個問題,如果h既是x的倍數,也是2*x的倍數, 那是減去x還是2*x呢?

很顯然是減去2*X,因為我們要求的是h減到0的最小次數,那可以是減去大的數次數更小啊。

所以我們整體思路就出來了,在減的過程中,判斷h2*x的倍數,如果是就減去2*x;如果不是就減去x

在這里插入圖片描述

代碼實現

#include <iostream>
using namespace std;
int main()
{int t;cin>>t;while(t--){int n;cin>>n;n--;//第一次減去1int ret = 1,x = 1;while(n){if(n % (2*x) == 0)x*=2;n-=x;ret++;}cout<<ret<<endl;}return 0;
}

三、最長上升子序列(二)

題目解析

在這里插入圖片描述

對于這道題,給定一個數組,然后我們要找到這個數組中最長嚴格上升子序列的長度;

嚴格上升子序列:一個數組刪掉其中一些數(可以不刪)之后,形成的新數組它是嚴格上升(非遞減)的。

簡單來說就是:一個數組的子序列,這個子序列是嚴格上升的。

現在我們要找到所有上升子序列中長度最長的子序列;然后返回它的長度。

算法思路

對于這道題,一眼看起,可以說毫無思路;這該如何去找啊?

細細看來:

我們要找所有嚴格上升的子序列,當我們遍歷到某一個位置時,我們要知道這個位置的數據和前面位置的數據是否能夠形成嚴格上升的子序列;所以我們就要知道這個位置前面有多少個嚴格上升的子序列,這個位置的數據能放到哪些子序列當中去?

所以我們就要記錄:當前所有的嚴格上升子序列,以及子序列中的元素。

那我們如何去記錄所有的嚴格上升子序列呢?

當遍歷到一個位置時:

這個位置如果是大于等于前面所有位置的,那我們可以把這個位置的元素放到任意一個子序列的后面形成一個新的子序列;

但是,我們沒有必要去把這個元素放到每一個子序列的后面形成新的子序列。

加入前面有子序列11,21,2,4,當前位置數據是7,我們可以形成1,71,2,71,2,4,7三個新的子序列;但是我們可以發現長度為2的子序列有兩個1,21,7,我們有必要把這兩個長度一樣的子序列都記錄下來嗎?

很顯然是不需要的,我們只需要記錄長度為n的子序列它最后一個元素最小的子序列即可

所以,我們只需要按長度n1,2,3...n)記錄子序列即可。

那問題又來了,我們要記錄子序列中的所有元素嗎?

比如11,21,2,41,2,4,7,我們要記錄子序列中的所有元素嗎?

當然也是沒有必要的;當我們遍歷一個位置時,我們只需要判斷這個位置的能否和前面的子序列組成新的子序列;我們不需要關心這個子序列是什么,所以我們只需要保存子序列最后一個位置的元素即可。

那現在還有一個問題:遍歷一個位置時,它可以與前面子序列形成新的子序列,但是長度不是最大的怎么辦?

簡答來說:現在有子序列11,21,2,41,2,4,7四個子序列,現在遍歷到某一個位置,這個位置的值是3

它可以和1形成1,3但是最后一個元素是3是大于1,2的最后一個元素2的,我們可以不用考慮。

它可以和1,2形成1,2,3,它最后一個元素3是小于1,2,4最后一個元素4的,我們就要修改長度為3的子序列,將4修改成3

OK啊,現在大致明白了這道題如何去解決;

但是我們要遍歷一遍數組,而且還要去判斷一個某一個位置是否能和前面子序列形成新的子序列,形成新的子序列是否比之前的子序列更好;那就要存放每一個長度的子序列對應的最后一個元素的值;時間復雜度那不就是O(n^2)了,題目明確要求時間復雜度是O(n log N)啊。

二分查找

所以這里我們要使用二分算法去優化查找。

當我們遍歷到一個位置時,當這個位置的值是>=dp[pos](大于長度最大的子序列的最后一個位置),它可以和長度最大的子序列形成一個新的子序列,長度就是pos+1,直接新增一個位置即可(dp[pos+1] = x)。

但是如果這個位置的值是小于長度最大的子序列的最后一個位置,它可能可以和前面的某一個子序列形成新的子序列,而形成新的子序列的最后一個位置的值,一定是小于等于之前該長度的子序列最后一個位置的值的。

所以我們就要找到這個子序列;

我們按暴力查找它的時間復雜度是O(n);但是我們仔細思考可以發現,我們存放的是長度為n的子序列的最后一個位置的值,那這個數組dp是不是就是非遞減的了?

所以我們就可以使用二分查找來搜索這個子序列,而我們要找的也就是>=當前位置的值的區間左端點。

在這里插入圖片描述

代碼實現

class Solution {public:int dp[100001];int pos = 0;int LIS(vector<int>& a) {for (auto& e : a) {if (pos == 0 || e >= dp[pos])dp[++pos] = e;else {int l = 1, r = pos;while (l < r) {int mid = l + (r - l) / 2;if (dp[mid] >= e)r = mid;elsel = mid + 1;}dp[l] = e;}}return pos;}
};

到這里,本篇文章內容就結束了。
繼續加油啊!!!

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

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

相關文章

UE RPG游戲開發練手 第二十七課 普通攻擊2

UE RPG游戲開發練手 第二十七課 普通攻擊2 1. 創建普通攻擊的蒙太奇動畫 2.打開4個蒙太奇動畫&#xff0c;修改插槽為FullBody,修改動畫速度 3.編輯動畫藍圖&#xff0c;插入FullBody插槽讓普通攻擊動畫得以播放 4. 編輯GA_LightAttack技能藍圖

MySQL——日志

undo log(回滾日志)&#xff1a;引擎層生成的日志&#xff0c;實現了事務的原子性&#xff0c;用于事務回滾和MVCC。redo log(重做日志)&#xff1a;引擎層生成的日志&#xff0c;實現了事務的持久性&#xff0c;用于非正常關閉的數據恢復。bin log(歸檔日志)&#xff1a;Serve…

QML 動畫控制、順序動畫與并行動畫

目錄 引言相關閱讀基礎屬性說明工程結構示例代碼解析示例1&#xff1a;手動控制動畫&#xff08;ControlledAnimation.qml&#xff09;示例2&#xff1a;順序動畫&#xff08;SequentialAnimationDemo.qml&#xff09;示例3&#xff1a;并行動畫&#xff08;ParallelAnimationD…

PowerShell 實現 conda 懶加載

問題 執行命令conda init powershell會在 profile.ps1中添加conda初始化的命令。 即使用戶不需要用到conda&#xff0c;也會初始化conda環境&#xff0c;拖慢PowerShell的啟動速度。 解決方案 本文展示了如何實現conda的懶加載&#xff0c;默認不加載conda環境&#xff0c;只…

R語言學習--Day03--數據清洗技巧

在一般情況下&#xff0c;我們都是在數據分析的需求前提下去選擇使用R語言。而實際上&#xff0c;數據分析里&#xff0c;百分之八十的工作&#xff0c;都是在數據清洗。并不只是我們平時會提到的異常值處理或者是整合格式&#xff0c;更多會涉及到將各種各樣的數據整合&#x…

谷歌地圖代理 | 使用 HTML 和矢量模式 API 更輕松地創建 Web 地圖

在過去的一年里&#xff0c;谷歌對 Maps JavaScript API 進行了兩項重要更新&#xff0c;以便更輕松地采用我們最新、最好的地圖&#xff1a;HTML 地圖和矢量模式 API。今天谷歌地圖亞太區最大代理商之一的 Cloud Ace云一 為大家介紹一下更新的具體內容。 聯系我們 - Cloud Ac…

WL-G4048 Multi-Port PCIe 4.0 Switch

系列文章目錄 文章目錄 系列文章目錄《WL-G4048 Multi-Port PCIe 4.0 Switch數據手冊》總結一、芯片介紹二、芯片規格介紹&#xff08;一&#xff09;功能指標&#xff08;二&#xff09;管理調試和監控&#xff08;三&#xff09;參考時鐘&#xff08;四&#xff09;系統復位 …

召回11:地理位置召回、作者召回、緩存召回

GeoHash 召回 屬于地理位置召回&#xff0c;用戶可能對附近發生的事情感興趣。GeoHash 是一種對經緯度的編碼&#xff0c;地圖上每個單位矩形的 GeoHash 的前幾位是相同的&#xff0c;GeoHash 編碼截取前幾位后&#xff0c;將相同編碼發布的內容按時間順序&#xff08;先是時間…

高效批量合并Word文檔的工具介紹

軟件介紹 本文介紹一款專門用于批量合并Word文檔的工具&#xff0c;名為批量合并word工具。 使用方法與特點 如果需要將多個Word文檔合并到一個Word文檔中&#xff0c;就可以使用這款工具。使用前&#xff0c;需把要合并的Word文檔都放在名為“word”的文件夾下。 該軟件沒有…

機器學習入門之KNN算法和交叉驗證與超參數搜索(三)

機器學習入門之KNN算法和交叉驗證與超參數搜索&#xff08;三&#xff09; 文章目錄 機器學習入門之KNN算法和交叉驗證與超參數搜索&#xff08;三&#xff09;一、KNN算法-分類1. 樣本距離判斷明可夫斯基距離 2. KNN 算法原理3. KNN 的缺點4. KNN 的 API5. 使用 sklearn 實現 …

小剛說C語言刷題—1700請輸出所有的2位數中,含有數字2的整數

1.題目描述 請輸出所有的 2 位數中&#xff0c;含有數字 2 的整數有哪些&#xff0c;每行 1個&#xff0c;按照由小到大輸出。 比如&#xff1a; 12、20、21、22、23… 都是含有數字 2的整數。 輸入 無 輸出 按題意要求由小到大輸出符合條件的整數&#xff0c;每行 1 個。…

在MYSQL中導入cookbook.sql文件

參考資料&#xff1a; GitHub 項目&#xff1a;svetasmirnova/mysqlcookbook CSDN 博客&#xff1a;https://blog.csdn.net/u011868279/category_11645577.html 建庫&#xff1a; mysql> use mysql Reading table information for completion of table and column names …

Scrapy框架下地圖爬蟲的進度監控與優化策略

1. 引言 在互聯網數據采集領域&#xff0c;地圖數據爬取是一項常見但具有挑戰性的任務。由于地圖數據通常具有復雜的結構&#xff08;如POI點、路徑信息、動態加載等&#xff09;&#xff0c;使用傳統的爬蟲技術可能會遇到效率低下、反爬策略限制、任務進度難以監控等問題。 …

【Win32 API】 lstrcmpA()

作用 比較兩個字符字符串&#xff08;比較區分大小寫&#xff09;。 lstrcmp 函數通過從第一個字符開始檢查&#xff0c;若相等&#xff0c;則檢查下一個&#xff0c;直到找到不相等或到達字符串的末尾。 函數 int lstrcmpA(LPCSTR lpString1, LPCSTR lpString2); 參數 lpStr…

代碼隨想錄60期day38

2維背包 #include<bits/stdc.h> using namespace std;int main(){int n,bagweight;cin>>n>>bagweight;vector<int>weight(n,0);vector<int>value(n,0);for(int i 0 ; i <n;i){cin>>weight[i];}for(int j 0;j<n;j){cin>>val…

[模型部署] 1. 模型導出

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

mac的Cli為什么輸入python3才有用python --version顯示無效,pyenv入門筆記,如何查看mac自帶的標準庫模塊

根據你的終端輸出&#xff0c;可以得出以下結論&#xff1a; 1. 你的 Mac 當前只有一個 Python 版本 系統默認的 Python 3 位于 /usr/bin/python3&#xff08;這是 macOS 自帶的 Python&#xff09;通過 which python3 確認當前使用的就是系統自帶的 Pythonbrew list python …

Java注解詳解:從入門到實戰應用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一種元數據機制&#xff0c;用于為代碼提供附加信息。它廣泛應用于框架開發、代碼生成、編譯檢查等領域。本文將從基礎到實戰&#xff0c;全面解析Java注解的核心概念和使用場景。 2. 注解基礎概念 2.1 什…

前端方法的總結及記錄

個人簡介 &#x1f468;?&#x1f4bb;?個人主頁&#xff1a; 魔術師 &#x1f4d6;學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全棧發展 &#x1f6b4;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于政務服務網事業 &#x1f1e8;&#x1f1f3;人生格言&…

組件導航 (HMRouter)+flutter項目搭建-混合開發+分欄效果

組件導航 (Navigation)flutter項目搭建 接上一章flutter項目的環境變量配置并運行flutter 1.flutter創建項目并運行 flutter create fluter_hmrouter 進入ohos目錄打開編輯器先自動簽名 編譯項目-生成簽名包 flutter build hap --debug 運行項目 HMRouter搭建安裝 1.安…