算法(keep learning)

基礎算法

背模板加刷題

排序

在這里插入圖片描述

快排

主要思想:分治

  • 第一步:確認一個分界點,比如起點,中間點(分界點),末點
  • 第二步:調整區間,使得第一個區間的數都小于等于分界點,第二個區間都大于分界點
  • 遞歸處理左右兩端
private static int[] quickSort(int[] arr, int left, int right) {// 遞歸終止條件,如果左邊界大于等于右邊界則認為遞歸結束if (left >= right) {return arr;}// 設定一個分界值,這里是(left + right)/ 2int p = arr[left + right >> 1];// 左右提前預留一個位置int i = left - 1;int j = right + 1;while (i < j) {// 等效于do while// 當數值小于分界值時持續遍歷,直到找到第一個大于等于分界值的索引// 如果是逆序則調整兩個while循環while (arr[++i] < p);while (arr[--j] > p);// 交換左右兩側不符合預期的數值if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 由于分界值取的是left + right >> 1,因此遞歸取的是left,j j + 1,rightquickSort(arr, left, j);quickSort(arr, j + 1, right);return arr;
}

歸并排序

歸并排序本質上就是分治!
但是跟快排的分治方法不一樣

  • 以整個數組的中間點劃分
  • 遞歸排序兩邊
  • 將兩個有序的數組合并
private static int[] mergeSort(int[] arr, int left, int right) {// 遞歸終止條件,如果左邊界大于等于右邊界則認為遞歸結束if (left >= right) {return arr;}// 設定一個分界值,這里是(left + right)/ 2int mid = left + right >> 1;	// 位運算// 切割arr = mergeSort(arr, left, mid);arr = mergeSort(arr, mid + 1, right);// 歸并,長度剛好是 left 到 rightint[] temp = new int[right - left + 1];int i = left;int j = mid + 1;// 用來歸并的索引int k = 0;while (i <= mid && j <= right) {// 如果是逆序則調整if條件if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 如果其中一半已經遍歷完,另一半可能還有剩余元素,直接全部拷貝過來。一般二者肯定會剩下一個出來while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 根據歸并后的數組重新賦值排序后的數組for (i = left, j = 0; i <= right; i++, j++) {arr[i] = temp[j];}return arr;
}

二分

有單調性一定可以二分,但是二分不一定有單調性

整數二分
// 檢查x是否滿足某種性質  
private static boolean check(int x) {  /* ... */  
}  // 區間[left, right]被劃分成[left, mid]和[mid + 1, right]時使用: 
// 或者稱之為左二分查詢,查找左側第一個滿足條件的數
private static int leftBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right >> 1];  if (check(mid)) {  right = mid;    // check()判斷mid是否滿足性質  } else {  left = mid + 1;  }  }  return left;  
}  // 區間[left, right]被劃分成[left, mid - 1]和[mid, right]時使用:  
// 或者稱之為右二分查詢,查找右側最后一個滿足條件的數
private static int rightBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right + 1 >> 1];  if (check(mid)) {  left = mid;    // check()判斷mid是否滿足性質  } else {  right = mid - 1;  // 有加必有減}  }  return left;  
}
浮點二分
// 檢查x是否滿足某種性質  
private static boolean check(double x) {  /* ... */  
}  // eps 表示精度,取決于題目對精度的要求,默認負六次方
private static double EPS = 1e-6;private static double floatBinarySearch(double left, double right) {  while (right - left > EPS) {  double mid = (left + right) / 2;  if (check(mid)) {  right = mid;  } else {  left = mid;  }  }  return left;  
}

一維前綴和

S[i] = a[1] + a[2] + … a[i]
a[l] + … + a[r] = S[r] - S[l - 1]

private static final int N = 100010;
private static final int[] a = new int[N + 5];
private static final int[] s = new int[N + 5];private static void init(int n) {  for (int i = 1; i <= n; i++) {  s[i] = s[i - 1] + a[i];  }  
}  private static int sumPrefix(int left, int right) {  return s[right] - s[left - 1];  
}

二維前綴和

S[i, j] = 第 i 行 j 列格子左上部分所有元素的和
以(x1, y1)為左上角,(x2, y2)為右下角的子矩陣的和為:
S[x2, y2] - S[x1-1, y2] - S[x2, y1-1] + S[x1-1, y1-1]

private static final int N = 1010;  
private static final int[][] a = new int[N + 5][N + 5];  
private static final int[][] s = new int[N + 5][N + 5];private static void init(int n, int m) {  for (int i = 1; i <= n; i++) {  for (int j = 1; j <= m; j++) {  s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];  }  }  
}  private static int sumPrefix(int x1, int y1, int x2, int y2) {  return s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];  
}

一維差分

給區間[l, r]中的每個數加上 c:B[l] += c, B[r + 1] -= c
在這里插入圖片描述

private static final int N = 100010;  
private static final int[] a = new int[N + 5];  
private static final int[] b = new int[N + 5];private static void init(int n) {  for (int i = 1; i <= n; i++) {  b[i] = a[i] - a[i - 1];  }  
}  private static void difference(int left, int right, int c) {  b[left] += c;  b[right + 1] -= c;  
}

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

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

相關文章

Django項目架構

背景&#xff1a;很多人寫 Django 時容易“什么都往 views 里塞”&#xff0c;結果項目一大就亂套了。需要把 視圖層 / 業務層 / 數據層 等職責清晰分出來。圖解說明Client&#xff1a;瀏覽器 / App / 前端調用 API。urls.py&#xff1a;定義 API 路由&#xff0c;把請求分發到…

MySQL】從零開始了解數據庫開發 --- 表的操作

永遠記住&#xff0c;你的存在是有意義的&#xff0c; 你很重要&#xff0c; 你是被愛著的&#xff0c; 而且你為這個世界帶來了無可取代的東西。 -- 麥克西 《男孩、鼴鼠、狐貍和馬》-- 從零開始了解數據庫開發創建數據表查看表結構修改數據表結構重命名表復制表刪除表今天我們…

MySQL底層架構設計原理詳細介紹

文章目錄一、MySQL體系結構概覽二、連接層&#xff08;Connection Layer&#xff09;1. 連接器&#xff08;Connectors&#xff09;2. 連接池&#xff08;Conncction Pool&#xff09;三、服務層&#xff08;Server Layer&#xff09;1. SQL接口組件&#xff08;SQL Interface&…

QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測

汽車內飾品聚氨酯束狀超細纖維合成革是指以海島型雙組份或多組分纖維加工成飛織造布&#xff0c;再經水性聚氨酯樹脂或溶劑型聚氨酯樹脂浸漬、濕法凝固、溶劑或堿液萃取及后整理等工藝制成的汽車內裝飾皮革。QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測項目測試項…

QML和Qt Quick

QML和Qt Quick QML 和 Qt Quick 是 Qt 框架中緊密相關但概念不同的兩個部分&#xff0c;它們之間的關系可以用如下方式清晰說明&#xff1a; 核心區別概覽??特性????QML????Qt Quick????本質??聲明式編程??語言??基于 QML 的??框架/庫????作用??定…

JavaScript 結構型設計模式詳解

1. 代理模式1.1. 使用場景代理模式在不改變原始對象的前提下&#xff0c;通過代理對象控制對其訪問&#xff0c;通常用于權限控制、延遲加載、遠程調用等場景。在前端開發中&#xff0c;可以通過代理模式對網絡請求、緩存機制等進行控制。1.2. 代碼實現class ApiService {reque…

攝像頭模塊在運動相機中的特殊應用

運動相機作為記錄高速運動場景的專用設備&#xff0c;其攝像頭模塊的設計與普通消費電子產品存在顯著差異。根據行業資料和技術發展&#xff0c;攝像頭模塊在運動相機中的特殊應用主要體現在以下五個維度&#xff1a;一、極端環境適應性設計運動相機的攝像頭模塊針對戶外運動場…

SpringBoot + MinIO/S3 文件服務實現:FileService 接口與 FileServiceImpl 詳解

在企業項目中&#xff0c;文件上傳和管理是非常常見的需求。本文基于 芋道源碼 的實現&#xff0c;介紹如何封裝一個通用的 文件服務 FileService&#xff0c;支持&#xff1a;文件上傳&#xff08;保存數據庫記錄 存儲文件到 S3/MinIO 等對象存儲&#xff09;文件下載與刪除文…

Oracle RAC認證矩陣:規避風險的關鍵指南

RAC Certification Matrix&#xff08;RAC認證矩陣&#xff09; 是Oracle官方發布的硬件、軟件與操作系統兼容性清單&#xff0c;明確規定了哪些平臺、組件和版本可以正式支持Oracle RAC&#xff08;Real Application Clusters&#xff09;的部署。它是搭建或升級RAC環境時必須…

【自然語言處理與大模型】如何通過微調來agent性能?

雖然大模型本身具備一定的指令理解和工具調用潛力&#xff0c;但在實際應用中&#xff0c;尤其是在復雜或專業領域&#xff0c;往往需要通過微調來提升Agent的工具調用能力。問題一&#xff1a;基座模型無法準確識別或選擇特定領域的工具當Agent需要在醫療、金融、法律、工業控…

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行 在使用 STM32 進行調試時&#xff0c;默認情況下代碼會被燒寫到 Flash 中運行。然而&#xff0c;Flash 寫入速度較慢&#xff0c;擦寫次數有限&#xff0c;且調試過程中頻繁燒寫可能影響開發效率。在某些場景下&#xff08;如快…

【51單片機】【protues仿真】基于51單片機寵物投食系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示時間、溫度、食物重量 2、按鍵手動投喂食物? 3、稱重模塊檢測當前食物重量 4、食物重量小于閾值會聲光警報并自動投喂 二、使用步驟 基于51單片機的寵物投食…

騰訊云負載均衡增加訪問策略后訪問失敗

為了測試&#xff0c;在負載均衡的安全組添加2條安全策略&#xff0c;限制辦公室內IP可訪問&#xff0c;其他IP地址拒絕所有訪問。結果&#xff0c;訪問失敗。經過反復測試&#xff0c;主要是js問價加載失敗&#xff0c;動態接口訪問代碼返回正常。再進行測試&#xff0c;發現去…

CSS的文本樣式

1.文本樣式的分類注意&#xff1a;必須先建立標簽&#xff0c;再在head中修改1.1字體樣式1.1.1字體顏色代碼演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

R語言讀取excel文件數據-解決na問題

文章目錄安裝R語言運行環境實現代碼遇到的問題總結安裝R語言運行環境 安裝教程連接, 包含國內鏡像快速下載 實現代碼 實現思路&#xff1a;使用python將文件的空字符的位置變成0&#xff0c;生成csv文件后交給R語言處理python實現代碼如下&#xff1a; import pandas as pd…

【Nginx 運維實戰】版本替換:強制 vs 平滑升級全解析

【Nginx 運維實戰】版本替換&#xff1a;強制 vs 平滑升級全解析一&#xff1a;版本替換的兩種思路二&#xff1a;使用場景對比三&#xff1a;實戰1&#xff09;強制替換1.備份舊版本2.替換為新版本3.**賦予執行權限**4.**重啟 Nginx**2&#xff09;平滑替換1.確認進程文件2.備…

MQ-消息隊列

定義 Mssage Queue&#xff1a;消息隊列。它是一種“先進先出”&#xff08;FIFO&#xff09;的數據結構&#xff0c;用于在分布式系統或應用程序之間進行異步通信。組成1. 生產者&#xff08;Producer&#xff09;定義&#xff1a;消息的發送方&#xff0c;負責將業務系…

NVIDIA驅動程序核心的“即時編譯器”(Just-in-Time, JIT Compiler)詳細介紹

我們來詳細、深入地剖析這個位于NVIDIA驅動程序核心的“即時編譯器”&#xff08;Just-in-Time, JIT Compiler&#xff09;。它堪稱CUDA生態系統成功的“幕后英雄”&#xff0c;是連接軟件穩定性和硬件飛速發展的關鍵橋梁。 第一部分&#xff1a;JIT編譯器的本質 首先&#xff…

【PS2025全網最新版】穩定版PS2025保姆級下載安裝詳細圖文教程(附安裝包)(Adobe Photoshop)

今天&#xff0c;給大家帶來PS2025的保姆級下載安裝圖文教程。 前言&#xff1a; Adobe Photoshop 作為業界領先的圖像處理與設計軟件&#xff0c;持續推動著數字創意領域的發展。其應用涵蓋平面設計、攝影后期、UI/UX 設計、影視特效等多個專業方向&#xff0c;為用戶提供強…

分享TWS充電倉方案開發設計

TWS耳機市場“卷”到最后&#xff0c;拼的早已不只是音質&#xff0c;而是續航、交互、體積、成本四位一體。傳統充電倉用多顆IC堆砌&#xff1a;升壓、電量計、霍爾、LED驅動、保護IC……BOM高、貼片復雜、調試周期長。8位MCU把上述功能“一鍋端”&#xff1a;單芯片即完成電源…