【算法】代碼隨想錄之數組

文章目錄

前言

一、二分查找法(LeetCode--704)

二、移除元素(LeetCode--27)

三、有序數組的平方(LeetCode--977)

四、長度最小的子數組(LeetCode--209)

五、螺旋矩陣II(LeetCode--59)


前言

跟隨代碼隨想錄,學習數組相關的算法題目,記錄學習過程中的tips。


一、二分查找法(LeetCode--704)

【1】算法功能:在有序數組中,查找指定元素,時間復雜度為O(log N)。

【2】算法思想:定義首尾指針分別指向數組的首尾元素,若中間元素的值小于目標值則將首指針移動至中間元素右側,若中間元素的值大于目標值則將尾指針移動至中間元素的左側,若相等則返回下標。

【3】代碼實現:在左閉右閉的區間內查找。

class Solution {
public:int search(vector<int>& nums, int target) {int low = 0, high = nums.size() - 1;while (low <= high) {int mid = (low + high) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;}
};

【4】易錯點:①注意while循環的判定條件;②注意high的更新條件。


二、移除元素(LeetCode--27)

在之前的刷題中已經遇到過,且代碼隨想錄的解法與當時我的初次解法相同,見【LeetCode算法】第27題:移除元素-CSDN博客。


三、有序數組的平方(LeetCode--977)

【1】題目描述:

【2】解決思想:首先,找到正負元素的分界線,利用雙指針法來解決。i指針指向最后一個負元素,j指針指向第一個正元素。每次比較i和j元素的大小,誰小就加入目標數組中。i指針向左移動,j指針向右移動。

【3】C++代碼:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ret;//最終返回的數組//找到首個>=0的元素(分界線)int k = 0;int len = nums.size();while (k < len && nums[k] < 0) {++k;}//雙指針法:i從k處往左,j從k處往右int i = k - 1, j = k;while (i >= 0 || j < len) {if (i < 0) {ret.push_back(nums[j] * nums[j]);++j;} else if (j >= len) {ret.push_back(nums[i] * nums[i]);--i;} else if (abs(nums[i]) < abs(nums[j])) {ret.push_back(nums[i] * nums[i]);--i;} else {ret.push_back(nums[j] * nums[j]);++j;}}return ret;}
};

【4】時間復雜度:O(N)。

【5】空間復雜度:O(1),不算目標數組ret。


四、長度最小的子數組(LeetCode--209)

【1】題目描述:

【2】解決思想:滑動窗口。定義兩個指針分別指向滑動窗口的起始位置和終止位置。在主循環中,讓終止位置不斷后移,每次后移均加上掃過的元素值。當累加值大于等于目標值時,循環縮小起始位置(為了找到最小的數組長度)。

【3】C++代碼:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int i = 0;//滑動窗口起始位置int sum = 0;int ret = INT_MAX;//j指向滑動窗口的終止位置for (int j = 0; j < nums.size(); ++j) {sum += nums[j];//循環縮小窗口的起始位置while (sum >= target) {ret = min(ret, j - i + 1);sum -= nums[i++];}}return ret == INT_MAX? 0 : ret;}
};

【4】時間復雜度:O(N)。

【5】空間復雜度:O(1)。

【6】啟示:當在一個樣本空間中尋找一組滿足某些條件的連續的子空間時,可以考慮采用滑動窗口方法。


五、螺旋矩陣II(LeetCode--59)

【1】題目描述:

【2】解決思想:如下圖所示,每一圈分為四種情況來處理:最上面、最右面、最下面、最左面。同時,每次處理每一條邊的時候都遵循左閉右開原則(處理最左邊節點,不處理最右邊節點),使得每一條邊的處理規則都一致。轉的圈數是n/2,當n為奇數時最后需要額外添加最中間的一個洞。

【3】C++代碼:

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ret(n, vector<int>(n, 0));int startX = 0, startY = 0;//起始點位置int offset = 1;//每轉一圈,偏移量+1int count = 1;//填入數組中的值int circleNum = n / 2;//轉的圈數for (int k = 0; k < circleNum; ++k) {int i, j;//第一條邊:最上面for (j = startY; j < n - offset; ++j) ret[startX][j] = count++;//第二條邊:最右面for (i = startX; i < n - offset; ++i)ret[i][j] = count++;//第三條邊:最下面for (; j > startY; --j)ret[i][j] = count++;//第四條邊:最左面for (; i > startX; --i)ret[i][j] = count++;startX++;startY++;offset++;}//維度為奇數時,填中間的一格if (n % 2 == 1)ret[startX][startY] = count;return ret;}
};

【4】時間復雜度:O(N^2)

【5】空間復雜度:O(1),不算存儲數據的數組。

【6】啟示:針對模擬轉圈的場景,找到一致性的處理規則很關鍵。

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

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

相關文章

花幾千上萬學習Java,真沒必要!(二)

1、注釋&#xff1a; java代碼注釋分3種&#xff1a; 單行注釋&#xff1a;//注釋信息 多行注釋: /*注釋信息*/ 文檔注釋:/**注釋信息*/ public class TestComments {// 這是單行注釋&#xff0c;用于注釋單行代碼或解釋代碼功能/* 這是多行注釋&#xff0c;用于注釋多行代碼…

Kotlin runCatching try-catch耗時比較

Kotlin runCatching try-catch耗時比較 fun main(args: Array<String>) {val lists arrayListOf("z")val idx 10/***納秒統計** ns&#xff08;nanosecond&#xff09;&#xff1a;納秒。一秒的10億分之一&#xff0c;10的-9次方秒。*   1納秒0.000001 毫秒…

基于實現Runnable接口的java多線程

Java多線程通常可以通過繼承Thread類或者實現Runnable接口實現。本文主要介紹實現Runnable接口的java多線程的方法, 并通過ThreadPoolTaskExecutor調用執行&#xff0c;以及應用場景。 一、應用場景 異步、并行、子任務、磁盤讀寫、數據庫查詢、網絡請求等耗時操作等。 以下…

筆記:在Entity Framework Core中如何處理多線程操作DbContext

一、目的&#xff1a; 在使用Entity Framework Core (EF Core) 進行多線程操作時&#xff0c;需要特別注意&#xff0c;因為DbContext類并不是線程安全的。這意味著&#xff0c;你不能從多個線程同時使用同一個DbContext實例進行操作。嘗試這樣做可能會導致數據損壞、異常或不可…

C語言排序之快速排序

快速排序是一種高效的排序算法。它采用了分治的策略&#xff0c;通過選擇一個基準元素&#xff0c;將待排序的序列劃分為兩部分&#xff0c;一部分的元素都比基準元素小&#xff0c;另一部分的元素都比基準元素大&#xff0c;然后對這兩部分分別進行快速排序&#xff0c;從而實…

前端開發工具

Lodash 有普通的 CommonJS 版本&#xff08;通常稱為 lodash&#xff09;和 ES6 模塊版本&#xff08;稱為 lodash-es&#xff09;。它們的主要區別包括&#xff1a; 模塊化&#xff1a;lodash 是傳統的 CommonJS 模塊&#xff0c;可使用 require 或 import 引入&#xff1b;lo…

2024年,搞AI就別卷模型了

你好&#xff0c;我是三橋君 2022年11月30日&#xff0c;OpenAI發布了一款全新的對話式通用人工智能工具——ChatGPT。 該工具發布后&#xff0c;僅用5天時間就吸引了100萬活躍用戶&#xff0c;而在短短2個月內&#xff0c;其活躍用戶數更是飆升至1億&#xff0c;成為歷史上增…

ARP協議介紹與ARP協議的攻擊手法

ARP是什么&#xff1f; ARP是通過網絡地址&#xff08;IP&#xff09;來定位機器MAC地址的協議&#xff0c;它通過解析網絡層地址&#xff08;IP&#xff09;來找尋數據鏈路層地址&#xff08;MAC&#xff09;的網絡傳輸協議。 對個定義不能理解的話&#xff0c;可以結合 TCP/I…

《戀與深空》2.0上線肉鴿模式,乙游玩家會買賬嗎?

乙游和肉鴿&#xff0c;看似八竿子打不著的兩個賽道&#xff0c;被疊紙給融合起來了。 根據《戀與深空》官方消息&#xff0c;即將在7月15日更新的2.0交錯視界版本中&#xff0c;會上線全新常駐玩法“混沌深網”&#xff0c;配置高隨機性Roguelike模式&#xff0c;并搭載了管理…

理想文檔發布了~一個集合了多個優秀開源項目的在線云文檔

兩年前我做了一個簡單的在線云文檔項目&#xff0c;選擇了開源的思維導圖、白板、流程圖、幻燈片等項目&#xff0c;在它們基礎上添加了云存儲的功能&#xff0c;然后寫了一個簡單的工作臺管理文件夾和文件&#xff1a; 放在了自己的個人網站上使用&#xff0c;同時寫了一篇水文…

【Leetcode 每日一題】349. 兩個數組的交集

給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2]示例 2&#xff1a; 輸入&#xff1a;nums…

[web]-代碼審計-運維失誤

打開頁面可以看到如下&#xff1a; 1、查看源代碼&#xff0c;發現驗證碼功能是正常生成的隨機的&#xff0c;輸入也沒有過濾&#xff0c;無法采用爆破。 2、根據題目提示運維失誤&#xff0c;使用dirsearch掃描&#xff0c;發現提交的地址check.php, 使用php5、.bak可以打開&…

2.The DispatcherServlet

The DispatcherServlet Spring的Web MVC框架與許多其他Web MVC框架一樣&#xff0c;是請求驅動的&#xff0c;圍繞一個中央Servlet&#xff08;即DispatcherServlet&#xff09;設計&#xff0c;該Servlet將請求分派給控制器&#xff0c;并提供其他功能以促進Web應用程序的開發…

創建I/O文件fopen

#include〈stdio.h〉 int mian(int argc,char *argv[]){ FILE *fp;//結構體fp fpfopen&#xff08;“1.txt”&#xff0c;“r”&#xff09;; }

程序的控制結構——if-else語句(雙分支結構)【互三互三】

目錄 &#x1f341; 引言 &#x1f341;if-else語句&#xff08;雙分支結構&#xff09; &#x1f449;格式1&#xff1a; &#x1f449;功能&#xff1a; &#x1f449;程序設計風格提示&#xff1a; &#x1f449;例題 &#x1f449;格式2&#xff1a; &#x1f449;…

Monaco 使用 ColorProvider

Manco 中可以使用調色板對色值進行修改&#xff0c;首先看一下調色版效果。 調色板是 Monaco-Editor 中一個特別的組件&#xff0c;通過兩個方法實現呼出調色板&#xff0c;provideColorPresentations 顯示調色窗口&#xff0c;provideDocumentColors 監聽頁面的變更&#xff0…

如何將libwebsockets庫編譯為x86架構

在之前的文章中&#xff0c;我們已經詳細介紹了如何交叉編譯libwebsockets并將其部署到ELF 1開發板上。然而在調試階段&#xff0c;發現將libwebsockets在Ubuntu環境下編譯為x86架構可能更為方便和高效。 通過在主機環境中編譯運用x86架構下的libwebsockets庫&#xff0c;可以…

阿里ChatSDK使用,開箱即用聊天框

介紹&#xff1a; 效果&#xff1a;智能助理 ChatSDK&#xff0c;是在ChatUI的基礎上&#xff0c;結合阿里云智能客服的最佳實踐&#xff0c;沉淀和總結出來的一個開箱即用的&#xff0c;可快速搭建智能對話機器人的框架。它簡單易上手&#xff0c;通過簡單的配置就能搭建出對…

Flowable工作流引擎核心事件詳細解釋說明

Flowable工作流引擎核心事件詳細解釋說明 流程執行事件 需要了解全部詳細事件的請看這個鏈接Flowable&#xff08;一個開源的工作流和業務流程管理引擎&#xff09;中與事件相關的一些核心概念 流程開始和結束事件 PROCESS_STARTED&#xff1a;標記流程實例的開始。PROCESS…

公益快報 | 中科億海微以企業獎學金為紐帶,深化校企合作

近日&#xff0c;為回報母校、激勵湖南大學機器人視覺感知與控制技術國家工程研究中心廣大學生&#xff0c;中科億海微電子科技&#xff08;蘇州&#xff09;有限公司&#xff08;簡稱“中科億海微”&#xff09;捐贈設立企業獎學金。此項獎學金的設立標志著校企合作邁向全方位…