C++知識點總結(8):尺取法

尺取法

  • 一、復習枚舉算法
    • 1. 算法三要素
    • 2. 最小公倍數公式
    • 3. 時間復雜度
  • 二、算法優化初級
    • 1. 概念
    • 2. 例題
      • (1) 最長小寫子串
        • Ⅰ 初步算法
        • Ⅱ 認識尺取法
        • Ⅲ 尺取法程序
      • (2) 最長遞增子串
      • (3) 最小子串和
        • Ⅰ 偽代碼
        • Ⅱ 完整代碼
      • (4) 最短字符串包含
        • Ⅰ 偽代碼
      • Ⅱ 代碼

一、復習枚舉算法

1. 算法三要素

【枚舉對象】要枚舉的對象
【枚舉范圍】每一個枚舉對象從幾開始,到幾結束
【篩選條件】篩選滿足一定條件的數據

2. 最小公倍數公式

假如現在要求整數 a a a 和整數 b b b 的最小公倍數。
求解公式如下:
a × b = g c d ( a , b ) × l c m ( a , b ) a \times b = gcd(a, b) \times lcm(a, b) a×b=gcd(a,b)×lcm(a,b)

3. 時間復雜度

一般指程序運行的最大次數,不能超過 1 0 8 10^8 108 ,即 1 e 8 1e8 1e8 ,時間復雜度越高,程序運行時間越長。

二、算法優化初級

1. 概念

通過針對題型的方式,來使算法的某一方面變得更強的過程(包括用時更短、空間更小)。

2. 例題

(1) 最長小寫子串

【題目描述】

給定一個由若干大寫小寫字符組成的字符串 s t r str str ,現在請你求出 s t r str str 中最長的小寫子串的長度。如果沒有,則輸出 0 0 0

【輸入描述】

1行,包含一個字符串 s t r str str

【輸出描述】

1行,包含最長小寫子串的長度。

【樣例1】

輸入

abcdeACzxc

輸出

5

【概念】

當串 a 中連續包含串 b 的所有元素時,
串 a 是串 b 的父串;
串 b 是串 a 的子串。
例如 a b c d e f g abcdefg abcdefg c d e cde cde 的子串。

Ⅰ 初步算法
for (int i = 0; i <= len-1; i++)
{for (int j = i; j <= len-1; j++){bool flag = true;for (int k = i; k <= j; k++){if (a[k] >= 'A' && a[k] <= 'Z'){bool flag = true;break;}}if (flag){// ...}}
}
// 打擂臺...
// 輸出...
Ⅱ 認識尺取法

尺取法,又稱雙指針法,是一種針對子串枚舉問題的優化算法。
在上述題目中,可用用下面的偽代碼來表示。

while (l < len) // 左指針沒有到結尾
{if ((s[r] >= 'a' && s[r] <= 'z') && r < len) // 右指針在小寫字母上并且不在結尾{r++;}erelse{max(..., r-l)l = r + 1;r = l;}
}
Ⅲ 尺取法程序
#include <iostream>
#include <string>
using namespace std;int main()
{// 輸入string s;cin >> s;// 尺取法int len = s.length();int l = 0, r = 0; // l 表示左端點, r 表示右端點int maxlen = 0;while (l < len){if (s[r] >= 'a' && s[r] <= 'z' && r < len) // 右指針在小寫字母上并且不在結尾{r++;}else{maxlen = max(maxlen, r-l);l = r + 1; // 移動左指針 r = l; // 右指針和左指針一起移動 }}// 輸出cout << maxlen; return 0;
}

(2) 最長遞增子串

#include <iostream>
#include <string> 
using namespace std;int main()
{// 輸入int n, s[10005] = {};cin >> n;for (int i = 0; i <= n-1; i++){cin >> s[i];} // 尺取法int l = 0, r = 0, maxlen = 1;while (l < n){if (s[r] < s[r+1] && r < n){r++;}else{maxlen = max(maxlen, r-l+1);l = r + 1;r = l;}}// 輸出cout << maxlen;return 0; return 0;
}

(3) 最小子串和

Ⅰ 偽代碼
while (l < len)
{if (sum < 9 && r < len){sum += a[r];r++;}else{if (sum >= 9){// 更新 r-lsum -= a[l];l++;}}
}
Ⅱ 完整代碼
#include <iostream>
using namepace std;int main()
{// 輸入int n, s, a[10005] = {};cin >> n;for (int i = 0; i <= n-1; i++){cin >> a[i];}cin >> s;// 尺取法int l = 0, r = 0, minlen = 1e8, sum = 0;while (l < n){if (sum < s && r < n){sum += a[r];r++;}else{if (sum >= s){minlen = min(minlen, r-l);}sum -= a[l];l++;}}// 輸出if (minlen == 1e8){cout << 0;}else{cout << minlen;}return 0;
}

(4) 最短字符串包含

Ⅰ 偽代碼
while (l < len)
{if (sum <= 26 && r < len) // sum 表示出現了多少個不同的字母{cnt[s[r]]++;if (cnt[s[r]] == 1){sum++;}r++;}else{if (sum >= 26){minlen = min(minlen, );}cnt[s[l]]--;l++;}
}

Ⅱ 代碼

#include <iostream>
#include <string>
using namespace std;int main()
{string s;cin >> s;int len = s.length();int l = 0, r = 0;int cnt[130] = {};int sum = 0;int minlen = 1e8;while (l < len){if (sum < 26 && r < len){cnt[s[r]]++;if (cnt[s[r]] == 1) sum++;r++;}else{if (sum >= 26){minlen = min(minlen, r-l);}cnt[s[l]]--;if (cnt[s[l]] == 0){sum--;}l++;}}cout << minlen;return 0;
}

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

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

相關文章

打破常規思維:Scrapy處理豆瓣視頻下載的方式

概述 Scrapy是一個強大的Python爬蟲框架&#xff0c;它可以幫助我們快速地開發和部署各種類型的爬蟲項目。Scrapy提供了許多方便的功能&#xff0c;例如請求調度、數據提取、數據存儲、中間件、管道、信號等&#xff0c;讓我們可以專注于業務邏輯&#xff0c;而不用擔心底層的…

MongoDB簡介與安裝

目錄 1. MongoDB簡介 2. 安裝MongoDB 3. 基本命令行操作 4. Java代碼實踐 MongoDB是一種NoSQL數據庫&#xff0c;以其靈活的文檔存儲模型和高度可擴展性而聞名。這篇文章將簡單介紹一下MongoDB的基本概念&#xff0c;包括其特點和優勢&#xff0c;并提供安裝MongoDB的步驟。…

MapReduce的執行過程(以及其中排序)

Map階段(MapTask)&#xff1a; 切片(Split)-----讀取數據(Read)-------交給Mapper處理(Map)------分區和排序(sort) Reduce階段(ReduceTask): 拷貝數據(copy)------排序(sort)-----合并(reduce)-----寫出(write) 1、Map task讀取&#xff1a; 框架調用InputFormat類的子類讀取…

Vue2與Vue3的語法對比

Vue2與Vue3的語法對比 Vue.js是一款流行的JavaScript框架&#xff0c;通過它可以更加輕松地構建Web用戶界面。隨著Vue.js的不斷發展&#xff0c;Vue2的語法已經在很多應用中得到了廣泛應用。而Vue3于2020年正式發布&#xff0c;帶來了許多新的特性和改進&#xff0c;同時也帶來…

rpc原理與應用

IPC和RPC&#xff1f; RPC 而RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;又叫做遠程過程調用。它本身并不是一個具體的協議&#xff0c;而是一種調用方式。 gRPC 是 Google 最近公布的開源軟件&#xff0c;基于最新的 HTTP2.0 協議&#xff0c;并支持常見…

【SQLite】SQLite3約束總結

前面學習了SQLite數據庫的常見使用方法&#xff0c;其中包含許多約束&#xff0c;常見的如NOT NULL、DEFAULT、UNIQUE、PRIMARY KEY&#xff08;主鍵&#xff09;、CHECK等 本篇文章主要介紹這些約束在SQLite中的使用 目錄 什么是約束NOT NULL 約束DEFAULT約束UNIQUE約束PRIMA…

【設計模式-3.2】結構型——適配器模式

說明&#xff1a;本文介紹設計模式中結構型設計模式中的&#xff0c;適配器模式&#xff1b; 插頭轉換器 適配器模式屬于結構型設計模式&#xff0c;設計思想體現在結構上的。以插頭轉換器為例&#xff0c;當你需要給手機充電&#xff0c;但是眼前只有一個三孔插座&#xff0…

Java基本類型的高級使用方法詳解

引言 Java中的基本數據類型&#xff08;primitive types&#xff09;是構建程序的基礎&#xff0c;包括整型、浮點型、字符型、布爾型等。除了直接使用這些基本類型外&#xff0c;Java還提供了一些高級的使用方法&#xff0c;使得我們能夠更靈活地處理基本類型數據。本文將深入…

二叉樹結點個數、葉子結點個數、樹的高度、第k層結點個數的計算(C語言)

目錄 前言 分治算法 模擬二叉樹代碼 結點個數計算 錯誤方法 不便利方法 基于分治思想的方法 葉子結點個數 樹的高度 第k層結點的個數 前言 在鏈式二叉樹的前序、中序、后續遍歷中我們模擬了一棵二叉樹&#xff0c;并實現了它的前、中、后序遍歷&#xff0c;現在我們來…

UE4 .ini文件使用

在需要給配置文件的類中加上config標簽&#xff0c;當然變量也要加 在項目的Config下&#xff0c;新建一個Default類的UCLASS中config等于的名字&#xff0c;這里結合上面截圖就是DefaultTest 在下面寫入 [/Script/項目名/類名] 然后寫變量以及對應的值即可

【Angular 開發】Angular 信號的應用狀態管理

自我介紹 做一個簡單介紹&#xff0c;年近48 &#xff0c;有20多年IT工作經歷&#xff0c;目前在一家500強做企業架構&#xff0e;因為工作需要&#xff0c;另外也因為興趣涉獵比較廣&#xff0c;為了自己學習建立了三個博客&#xff0c;分別是【全球IT瞭望】&#xff0c;【架構…

智能機器人在新材料方面遇到的挑戰

智能機器人在新材料方面面臨的挑戰包括但不限于以下幾點&#xff1a; 新材料的研發&#xff1a;機器人需要使用新材料來提高其性能和功能。然而&#xff0c;新材料的研發需要大量的時間和資金&#xff0c;同時還需要具備高超的技術和專業知識. 材料的可靠性&#xff1a;機器人…

GO面試題系列

1.GO有哪些關鍵字 2.GO有哪些數據類型 3.Go方法與函數的區別 在Go語言中&#xff0c;方法和函數是兩個不同的概念&#xff0c;盡管它們在某些方面有相似之處。下面是它們的主要區別&#xff1a; 定義位置&#xff1a; 函數&#xff1a; 函數是獨立聲明的&#xff0c;它們不…

python數據分析總結(pandas)

目錄 前言 df導入數據 df基本增刪改查 數據清洗 ?編輯 索引操作 數據統計 行列操作 ?編輯 df->types 數據格式化 ?編輯 日期數據處理 前言 此篇文章為個人python數據分析學習總結&#xff0c;總結內容大都為表格和結構圖方式&#xff0c;僅供參考。 df導入數…

Vue3使用vue-baidu-map-3x百度地圖

安裝vue-baidu-map-3x&#xff1a; // vue3 $ npm install vue-baidu-map-3x --save// vue2 $ npm install vue2-baidu-map --save 全局注冊/局部注冊&#xff1a; import { createApp } from vue import App from ./App.vue import BaiduMap from vue-baidu-map-3xconst app …

綜述 2017-Genome Biology:Alignment-free sequence comparison

Zielezinski, Andrzej, et al. "Alignment-free sequence comparison: benefits, applications, and tools." Genome biology 18 (2017): 1-17. https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1319-7 被引次數&#xff1a;476應用問題&…

curl 18 HTTP/2 stream

cd /Users/haijunyan/Desktop/CustomKit/KeepThreadAlive/KeepThreadAlive //Podfile所在文件夾 git config --global https.postBuffer 10485760000 git config --global http.postBuffer 10485760000 pod install https://blog.csdn.net/weixin_41872403/article/details/86…

linux命令積累

1.查找指定目錄下第二層目錄&#xff0c;一年前的文件 find $dir -maxdepth 1 -type d -mtime 365 2./data/att/dir1軟連接到/data1/att/dir1 硬連接和軟連接的區別 硬連接 ln file1 file2 1.硬連接不能對目錄進行鏈接。 2.硬連接修改一個文件&#xff08;不論修改哪方文件&…

top K問題(借你五分鐘)

目錄 前言 top K問題 模擬數據 建堆 驗證&#xff08;簡單了解即可&#xff09; 最終代碼 調試部分 前言 在大小堆的實現&#xff08;C語言&#xff09;中我們討論了堆的實際意義&#xff0c;在看了就會的堆排序&#xff08;C語言&#xff09;中我們完成了堆排序&#…

銀河麒麟本地軟件源配置方法

軟件源介紹 軟件源可以理解為軟件倉庫&#xff0c;當需要安裝軟件時則會根據源配置去相應的軟件源下載軟件包&#xff0c;此方法的優點是可以自動解決軟件包的依賴關系。常見的軟件源有光盤源、硬盤源、FTP源、HTTP源&#xff0c;本文檔主要介紹本地軟件源的配置方法&#xff…