【算法】經典算法題

文章目錄

  • 專題一:雙指針
    • 1. 移動零
    • 2. 復寫零
    • 3. 快樂數
    • 4. 盛最多水的容器
    • 5. 有效三角形的個數
    • 6. 查找總價格為目標值的兩個商品
    • 7. 三數之和
    • 8. 四數之和
  • 專題二:滑動窗口
    • 1. 長度最小的子數組
    • 2. 無重復字符的最長字串
    • 3. 最大連續1的個數 III
    • 4. 將 x 減到 0 的最小操作數

專題一:雙指針


1. 移動零


在這里插入圖片描述

題目解析
在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

// 寫法一
class Solution 
{
public:void moveZeroes(vector<int>& nums) {// 1、下標初始化int dest = -1, cur = 0;// 2、數組劃分while(cur < nums.size()){if(nums[cur]) swap(nums[++dest], nums[cur++]);else ++cur;}}
};// 寫法二
class Solution 
{
public:void moveZeroes(vector<int>& nums) {for(int dest = -1, cur = 0; cur < nums.size(); ++cur)if(nums[cur]) // 處理 非0 元素swap(nums[++dest], nums[cur]);}
};/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

2. 復寫零


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:void duplicateZeros(vector<int>& nums) {// 1、初始化int dest = -1, cur = 0, n = nums.size();// 2、找到最后一個復寫的數while(true){if(nums[cur]) dest += 1;else dest += 2;if(dest >= n - 1) break;++cur;}cout << nums[cur] << endl;// 1.5、預處理 -> 讓 dest 的下標有效if(dest == n){if(nums[cur]) --cur, --dest;else {nums[n - 1] = 0;dest -= 2;cur -= 1;}}// 2、雙指針從后往前進行復寫操作while(cur >= 0){if(nums[cur]) nums[dest--] = nums[cur--];else{nums[dest--] = 0;nums[dest--] = 0;cur--;} }}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

3. 快樂數


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
private:// 計算每個位置上的數字的平方和inline static int BitSum(int num){int ret = 0;while(num){int t = num % 10;ret += t * t;num /= 10;}return ret;}public:bool isHappy(int n) {int slow = n, fast = BitSum(n);while(slow != fast){slow = BitSum(slow);fast = BitSum(BitSum(fast));}return slow == 1;}
};

4. 盛最多水的容器


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1;int ret = INT_MIN;while(left != right){// 容積 = 長度 * 高度int v = (right - left) * min(height[left], height[right]);ret = max(ret, v);// 移動指針 - 誰小移動誰height[left] < height[right] ? ++left : --right;}return ret;}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

5. 有效三角形的個數


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:int triangleNumber(vector<int>& nums) {// 1、優化sort(nums.begin(), nums.end());// 2、利用雙指針解決問題int ret = 0, n = nums.size();for(int i = n - 1; i >= 2; --i){int left = 0, right = i - 1;while(left < right){// 當 a+b>c ,a下標屬于 [left, right-1]時,都能和 b、c 構成三角形// 當 a+b<=c ,b下標屬于[left-1, right]時,都不能和 a、c 構成三角形if(nums[left] + nums[right] > nums[i]){ret += right - left;--right;}else ++left;}}// 返回值return ret;}
};/*
- 時間復雜度:O(n^2)
- 空間復雜度:O(1)
*/

6. 查找總價格為目標值的兩個商品


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:vector<int> twoSum(vector<int>& price, int target) {// 1、數據初始化int left = 0, right = price.size() - 1;// 2、利用雙指針解決問題while(left < right){int sum = price[left] + price[right];if(sum < target) ++left;else if(sum > target) --right;else return {price[left], price[right]};}// 題目沒有明確說明沒有結果的話會怎么樣,那么該題的測試用例應該都是有結果的// 為了照顧編譯器要求一定要返回一個結果,所以我們最后返回一個空數組即可return {};}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

7. 三數之和


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {// 1、初始化int n = nums.size();vector<vector<int>> ret;// 2、排序sort(nums.begin(), nums.end());// 3、依次固定一個數for(int i = 0; i < n - 2;){// 4、雙指針算法找到兩數之和等于 aim 的元素int left = i + 1, right = n - 1, aim = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum < aim) ++left;else if(sum > aim) --right;else {ret.push_back( {nums[i], nums[left], nums[right]} );++left, --right; // 保證 left、right 選擇的元素不漏// 對 left、right 已經選擇過的元素去重while(left < right && nums[left] == nums[left - 1]) ++left;while(left < right && nums[right] == nums[right + 1]) --right;}}// 保證 i 選擇的元素不漏++i; // 對 i 已經選擇過的元素去重while(i < n - 2 && nums[i] == nums[i - 1]) ++i;}// 5、返回最終結果return ret;}
};
/*
- 時間復雜度:O(n^2)
- 空間復雜度:O(1)
*/

8. 四數之和


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 1、初始化int n = nums.size();vector< vector<int> > ret;// 2、排序sort(nums.begin(), nums.end());// 3、依次固定一個數,然后使用“三數之和”解決問題for(int i = 0; i < n - 3;) {// 4、再依次固定一個數,然后使用“雙指針”解決問題for(int j = i + 1; j < n - 2;) {int left = j + 1, right = n - 1;double aim = (double)target - nums[i] - nums[j];// 5、雙指針算法找到兩數之和等于 aim 的元素while(left < right){double sum = nums[left] + nums[right];if(sum < aim) ++left;else if(sum > aim) --right;else{ret.push_back( {nums[i], nums[j], nums[left], nums[right]} );++left, --right; // 保證 left、right 選擇的元素不漏// 對 left、right 已經選擇過的元素去重while(left < right && nums[left] == nums[left - 1]) ++left;while(left < right && nums[right] == nums[right + 1]) --right;}}// 保證 j 選擇的元素不漏++j;// 對 j 已經選擇過的元素去重while(j < n - 2 && nums[j] == nums[j - 1]) ++j;}// 保證 i 選擇的元素不漏++i;// 對 i 已經選擇過的元素去重while(i < n - 3 && nums[i] == nums[i - 1]) ++i;}// 6、返回最終結果return ret;}
};
/*
- 時間復雜度:O(n^3)
- 空間復雜度:O(1)
*/

專題二:滑動窗口


1. 長度最小的子數組


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:int minSubArrayLen(int target, vector<int>& nums) {// 1、初始化int n = nums.size();int minLength = INT_MAX;// 2、使用滑動窗口解決問題for(int left = 0, right = 0, sum = nums[0]; right < n;){if(sum >= target) {minLength = min(minLength, right - left + 1);sum -= nums[left++];}else {if(++right < n)sum += nums[right];}}// 3、返回值return minLength == INT_MAX ? 0 : minLength;}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

2. 無重復字符的最長字串


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:int lengthOfLongestSubstring(string s) {// 1、初始化int n = s.size();vector<int> count(256);int left = 0, right = 0, ret = 0;// 2、滑動窗口int length = 0; //用來記錄窗口長度while(right < n){if(!count[s[right]]) //進窗口{++count[s[right]];++length;++right;ret = max(ret, length); //更新結果}else //出窗口{--count[s[left]];--length;++left;}}// 3、返回值return ret;}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

3. 最大連續1的個數 III


在這里插入圖片描述

算法原理
在這里插入圖片描述

代碼編寫

class Solution 
{
public:int longestOnes(vector<int>& nums, int k) {// 1、初始化int n = nums.size();int ret = INT_MIN;// 2、滑動窗口int left = 0, right = 0;int length = 0; // 當前子數組中最長連續 1 的長度int zero = 0;  // 當前子數組中 0 出現的次數while(right < n){if(nums[right] != 0) // nums[right] 非 0,此時 right 一定入窗口{ret = max(ret, ++length);++right;}else{if(zero + 1 <= k) {ret = max(ret, ++length);++zero;++right;}else{if(nums[left++] == 0)  --zero;--length;}}}// 3、返回值return ret;}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

4. 將 x 減到 0 的最小操作數


在這里插入圖片描述


題目解析
在這里插入圖片描述


算法原理
在這里插入圖片描述


代碼編寫

class Solution 
{
public:int minOperations(vector<int>& nums, int x) {// 1、初始化int sum = 0;for(const auto e : nums) sum += e;int target = sum - x;// 2、細節處理(數組中所有元素都大于0,所以 target 小于 0 是不存在的)if(target < 0) return -1;// 3、滑動窗口int ret = -1;for(int left = 0, right = 0, tmp = 0; right < nums.size();){// 進窗口tmp += nums[right++];// 出窗口while(tmp > target) tmp -= nums[left++];// 更新結果if(tmp == target) ret = max(ret, right - left);}// 4、返回結果return ret == -1 ? ret : nums.size() - ret;}
};
/*
- 時間復雜度:O(n)
- 空間復雜度:O(1)
*/

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

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

相關文章

云原生技術演進之路-(云技術如何一步步演進的,云原生解決了什么問題?)

云技術如何一步步演進的&#xff1f; 云原生解決了什么問題&#xff1f; 物理設備 電腦剛被發明的時候&#xff0c;還沒有網絡&#xff0c;每個電腦&#xff08;PC&#xff09;&#xff0c;就是一個單機。 這臺單機&#xff0c;包括CPU、內存、硬盤、顯卡等硬件。用戶在單機…

電線電纜、漆包線工廠開源MES/生產管理系統/云MES

萬界星空科技專業的漆包線MES系統功能介紹&#xff1a; 從原材料出入庫-拉絲機等設備管理-漆包線稱重打印系統自動入庫&#xff08;支持多臺秤同時稱重&#xff09;-建立銷售報價、銷售訂單-生產訂單-支持掃碼出庫及自動揀貨出庫-應收應付賬款-對接各種其他系統及財務系統。 …

便攜式水污染物監測設備的招標參數有哪些

便攜式多參數水質檢測儀參數特點&#xff1a; 便攜式多參數水質檢測儀參數特點&#xff1a; 便攜式多參數水質快速測定儀&#xff0c;根據國家檢測標準&#xff08;G B &#xff09; 及環境部檢測標準(H J &#xff09;研發生產&#xff0c;本儀器具有檢測快速、操作簡單、測試…

python3實現類似expect shell的交互式與SFTP的腳本

前面寫過一篇關于python實現類似expect shell的交互式能力的文章&#xff0c;現在補全一下加上sftp的能力腳本。 例子在代碼中__example()方法。 依賴paramiko庫&#xff0c;所以需要執行pip install paramiko來安裝。 import os import queue import re import threading im…

綜合實力盤點高性價比還優質的云服務器:亞馬遜云科技仍然領跑市場

如果說云計算是一條流向數字化未來的河流&#xff0c;那亞馬遜云科技毫無疑問是航行在最前面的帆船&#xff1b;如果說云計算是一條通往數字化未來的鐵軌&#xff0c;那亞馬遜云科技就是行駛在最前面的高鐵。接下來回首往昔&#xff0c;以史為鏡&#xff0c;得出云服務器哪家便…

毛里塔尼亞市場開發攻略,收藏一篇就夠了

毛里塔尼亞是非洲西北部的一個國家&#xff0c;也是中國長期援建的一個國家&#xff0c;也是一帶一路上的國家。毛里塔尼亞生產生活資料依賴進口&#xff0c;長期依賴跟我們國家的貿易關系也是比較緊密的&#xff0c;今天就來給大家介紹一下毛里塔尼亞的市場開發公路。文章略長…

Python監控服務進程及自啟動服務方法與實踐

1. 需求概述 當我們在Windows Server環境中部署XX系統的實際應用中&#xff0c;往往會遇到一些運維管理的挑戰。為了確保系統的持續穩定運行&#xff0c;特別是在服務程序因各種原因突然關閉的情況下&#xff0c;我們可以借助Python的強大生態系統來構建一個監控與自動重啟的管…

分布式鏈路追蹤入門篇-基礎原理與快速應用

為什么需要鏈路追蹤&#xff1f; 我們程序員在日常工作中&#xff0c;最常做事情之一就是修bug了。如果程序只是運行在單機上&#xff0c;我們最常用的方式就是在程序上打日志&#xff0c;然后程序運行的過程中將日志輸出到文件上&#xff0c;然后我們根據日志去推斷程序是哪一…

Comsol Multiphysics 6.2 for Mac建模仿真軟件

COMSOL Multiphysics是一款多物理場仿真軟件&#xff0c;旨在幫助工程師、科學家和研究人員解決各種復雜的工程和科學問題。該軟件使用有限元分析方法&#xff0c;可以模擬和分析多個物理場的相互作用&#xff0c;包括結構力學、熱傳導、電磁場、流體力學和化學反應等。 COMSOL…

一些好用的前端小插件(轉自知乎)

一些好用的前端小插件&#xff08;2&#xff09; 1. cropper.js Cropper.js 2.0 是一系列用于圖像裁剪的 Web 組件。 官網地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款瀏覽器端的 Markdown 編輯器&#xff0c;支持所見即所得、…

2024年度投資策略:AI大模型和半導體國產化加速

今天分享的是AI系列深度研究報告&#xff1a;《2024年度投資策略&#xff1a;AI大模型和半導體國產化加速》。 &#xff08;報告出品方&#xff1a;東方證券&#xff09; 報告共計&#xff1a;48頁 前言: 行情回顧與未來展望 電子板塊漲幅轉正&#xff0c;信心逐漸回歸。截至…

人人都會Blazor —— 3.3 參數

參數最常見的使用,目的是使組件可以接收動態數據。 聲明參數 參數使用 [Parameter] 特性的公共 C# 屬性進行定義。 在下面的示例中,內置引用類型 (System.String) 和用戶定義的引用類型 (PanelBody) 作為組件參數進行傳遞。 PanelBody.cs: public class PanelBody {publ…

SQL注入漏洞發現和利用,以及SQL注入的防護

一、背景 SQL注入漏洞是一種常見的軟件安全問題&#xff0c;它發生在應用程序的數據庫層中。其核心原理是將用戶輸入的數據當做代碼來執行&#xff0c;違反了“數據與代碼分離”的原則。具體來說&#xff0c;攻擊者通過構造惡意的SQL查詢語句&#xff0c;使得應用程序在執行SQ…

Android NFC手機上實現卡模擬

1&#xff0c; 問&#xff1a;能否在AndroidNFC手機上實現卡模擬&#xff1f; 答&#xff1a;在技術上可行&#xff0c;但是&#xff0c;對一般開發人員來講&#xff0c;目前看來僅僅是技術上可行。 2&#xff0c; 問&#xff1a;具體如何實現呢&#xff1f; 答&#xff1…

git的使用記錄

GitHub是公有的遠程倉庫&#xff0c;Gitlab是私有的遠程倉庫。 git add file git commit -m "add file" git mv filea fileb git log 顯示提交記錄 git log --oneline 一行的簡略信息顯示 git log --oneline --decorate 顯示當前指針 git reset --ha…

矩陣知識補充

正交矩陣 定義&#xff1a; 正交矩陣是一種滿足 A T A E A^{T}AE ATAE的方陣 正交矩陣具有以下幾個重要性質&#xff1a; A的逆等于A的轉置&#xff0c;即 A ? 1 A T A^{-1}A^{T} A?1AT**A的行列式的絕對值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

通用功能——git 攻略

摘要 本文主要介紹git常用命令的使用方法&#xff0c;同時介紹一些常見問題的處理方法&#xff0c;持續更新中… git命令通用選項 大多數git命令都適用的選項列表如下&#xff1a; -v, --verbose show hash and subject, give twice for upstream branch -q, --quie…

Vim 一下日志文件,Java 進程沒了?

一次端口告警&#xff0c;發現 java 進程被異常殺掉&#xff0c;而根因竟然是因為在問題機器上 vim 查看了 nginx 日志。下面我將從時間維度詳細回顧這次排查&#xff0c;希望讀者在遇到相似問題時有些許啟發。 時間線 15:19 收到端口異常 odin 告警。 狀態:P1故障 名稱:應用端…

黑馬點評筆記 redis實現優惠卷秒殺

文章目錄 難題全局唯一IDRedis實現全局唯一Id 超賣問題問題解決方案樂觀鎖問題 一人一單 難題 要解決優惠卷秒殺的問題我們要考慮到三個個問題&#xff0c;全局唯一ID&#xff0c;超賣問題&#xff0c;一人一單。 全局唯一ID 用戶搶購時&#xff0c;就會生成訂單并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替換成本地下載編譯安裝解決網絡超時問題

目錄 &#x1f311;&#x1f311; 背景 &#x1f312; &#x1f312;作用 &#x1f314;&#x1f314; 問題 &#x1f314;&#x1f314;解決方案 &#x1f319;方法一 &#x1f319;方法二 &#x1f31d;&#x1f31d;我的解決方案 整理不易&#xff0c;歡迎一鍵三連…