AI學習第七天

數組:基礎概念、存儲特性及力扣實戰應用

在計算機科學與數學的廣袤領域中,數組作為一種極為重要的數據結構,發揮著不可或缺的作用。它就像一個有序的 “數據倉庫”,能高效地存儲和管理大量數據。接下來,讓我們深入了解數組的奧秘。

一、數組的維度與數學表示

(一)向量與一維數組

在數學世界里,向量可表示為\(A = (a_0, a_1, \cdots, a_{n - 1})\)。對應到計算機編程中,這便是一維數組的概念 —— 由n個元素按順序依次排列而成,每個元素\(a_i\)(\(i = 0, 1, \cdots, n - 1\))都在數組里有著獨一無二的位置。例如,在存儲學生成績時,我們可以創建一個一維數組,數組中的每個元素分別對應一位學生的成績,方便快捷地對成績數據進行處理和管理。

(二)矩陣與二維數組

矩陣的數學表達式為\(A_{m×n}=\begin{bmatrix}a_{00}&a_{01}&\cdots&a_{0,n - 1}\\a_{10}&a_{11}&\cdots&a_{1,n - 1}\\\cdots&\cdots&\cdots&\cdots\\a_{m - 1,0}&a_{m - 1,1}&\cdots&a_{m - 1,n - 1}\end{bmatrix}\)。二維數組可視作由m行n列元素構成的矩陣,其中每個元素\(a_{ij}\)(\(i = 0, 1, \cdots, m - 1\);\(j = 0, 1, \cdots, n - 1\))都能通過其所在的行和列唯一確定。在表示棋盤狀態時,二維數組大顯身手,棋盤上每個格子的信息都能精準地存儲在對應的數組元素中。

(三)n 維數組的概念拓展

隨著維度的增加,數組變得更加復雜和靈活。當數組的下標由n個數組成時,就形成了n維數組。訪問這類數組中的元素,需要用到n個索引值。以三維數組為例,它常被用于三維圖形處理、氣象數據存儲(涉及空間的x、y、z坐標以及時間等維度)等場景。依此類推,n維數組能夠借助n個下標確定唯一的元素,為處理復雜的數據關系和多維數據集合提供了強大的支持。

二、數組的存儲特點

(一)內存連續存儲

數組元素在內存中是按順序連續存儲的,這使得計算機在訪問數組元素時能夠快速定位,大大提高了數據的訪問效率。

(二)存儲分配方式

不同編程語言的數組存儲分配方式有所不同。像C、\(C++\)、\(C\#\)等語言,數組按行進行存儲分配;而Fortran語言則是按列進行存儲分配。

(三)數組名的特性

數組名代表該數組在內存中的首地址,并且它是一個常量,在程序運行過程中不能被修改。

三、常用數組的存儲細節

(一)一維數組

對于一維數組\(a[n]\),其各元素按照下角標依次存放。例如在\(C\#\)中,我們創建一個整型一維數組int[] a = new int[5];,假設每個元素占用的存儲空間為c字節,那么第i個元素的存儲地址\(Loc(a[i]) = Loc(a[0]) + i×c\)?。

(二)二維數組

以二維數組\(a[m,n]\)為例,在\(C\#\)中創建int[,] a = new int[2,3];。若每個元素占用c字節,其元素存儲地址的計算公式為\(Loc(a[i,j]) = Loc(a[0,0]) + (i×n + j)×c\)。這種存儲方式與二維數組的矩陣結構相對應,便于根據行和列的索引快速計算出元素的存儲位置。

(三)三維數組

三維數組的存儲更為復雜,以\(a[m,n,l]\)為例,如在\(C\#\)中創建int[,,] a = new int[2,3,4];。它的存儲規律是第一維下標變化最慢,第三維(最后一維)下標變化最快。每個元素的存儲地址計算公式為\(Loc(a[i,j,k]) = Loc(a[0,0,0]) + (i×n×l + j×l + k)×c\)。這種存儲順序符合人們對三維空間的認知邏輯,方便在處理三維數據時進行高效的訪問和操作。

四、力扣實戰:數組相關算法題解析

(一)最長連續序列(力扣 128 題)

  1. 題目描述:給定一個未排序的整數數組nums,要求找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度,并設計實現時間復雜度為\(O(n)\)的算法。
  2. 示例
    • 輸入:nums = [100,4,200,1,3,2],輸出:4,解釋:最長數字連續序列是[1, 2, 3, 4],長度為4
    • 輸入:nums = [0,3,7,2,5,8,4,6,0,1],輸出:9
  3. 解題思路與代碼實現

收起

python

from typing import Listclass Solution:def longestConsecutive(self, nums: List[int]) -> int:if not nums:  # 增加對空列表的錯誤處理return 0nums_set = set(nums)  # 使用集合來提高查找速度length = 0for num in nums_set:if num - 1 in nums_set:continuelst1 = self.findBig(num, nums_set, [num])if len(lst1) > length:length = len(lst1)return lengthdef findBig(self, num, nums_set, lst1):while num + 1 in nums_set:lst1.append(num + 1)num += 1return lst1

在這段代碼中,首先將數組轉換為集合,利用集合查找元素的時間復雜度為\(O(1)\)的特性,提高查找效率。然后遍歷集合中的每個元素,若當前元素的前一個數不在集合中,則以此元素為起點,不斷尋找連續的數字序列,記錄下最長序列的長度并返回。

(二)兩數之和(力扣 1 題)

  1. 題目描述:給定一個整數數組nums和一個整數目標值target,需要在數組中找出和為目標值target的兩個整數,并返回它們的數組下標。假設每種輸入只會對應一個答案,且不能使用兩次相同的元素,可按任意順序返回答案。
  2. 示例
    • 輸入:nums = [2,7,11,15],?target = 9,輸出:[0,1],解釋:因為nums[0] + nums[1] == 9,所以返回[0, 1]
    • 輸入:nums = [3,2,4],?target = 6,輸出:[1,2]
  3. 解題思路與代碼實現

收起

python

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:# 創建一個字典來存儲數值與索引的對應關系num_to_index = {}# 遍歷數組一次for i, num in enumerate(nums):# 計算需要的補數complement = target - num# 檢查補數是否在字典中if complement in num_to_index:return [num_to_index[complement], i]# 將當前數值和索引存入字典num_to_index[num] = i# 如果沒有找到符合條件的數值對,拋出異常raise ValueError("沒有找到兩個數,使它們的和等于目標值")

此代碼通過創建一個字典,在遍歷數組的過程中,將每個元素的值和索引存入字典。同時,每次計算當前元素的補數,并檢查補數是否在字典中。若存在,則找到了滿足條件的兩個數,返回它們的索引;若遍歷結束仍未找到,則拋出異常。

數組在數據存儲和算法設計中占據著核心地位。深入理解數組的概念、存儲特性以及在算法題中的應用,能夠為我們在編程之路上打下堅實的基礎,幫助我們更高效地解決各種復雜的問題。希望通過本文的分享,大家能對數組有更全面、更深入的認識,在編程實踐中靈活運用數組知識,提升編程技能。

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

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

相關文章

ue5 創建多列StreeView的方法與理解

創建StreeView的多列樣式怎么就像是創建單行單列差不多?貌似就是在單行單列中加入了多列widget? 示例代碼 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailTabWidget){…

Linux之yum詳解

—— 小 峰 編 程 目錄 1、Linux軟件的安裝方式 2、什么是yum 3、配置網絡yum源 4、yum命令 【語法】 【yum常用命令】 1、Linux軟件的安裝方式 在CentOS系統中,軟件管理方式通常有三種方式: rpm安裝 、 yum安裝 以及 編譯安裝 。 2、什么是yum…

lvgl運行機制分析

lv_timer_handler() 是 LVGL 的“心臟”:這個函數會依次做以下事情: 處理定時器(如動畫、延遲回調)。 讀取輸入設備(如觸摸屏、按鍵的狀態)。 刷新臟區域(僅重繪屏幕上發生變化的區域&#xf…

達夢數據庫授權給某個用戶查詢其他指定用戶下所有表的權限

方法1: 新版本有一個數據庫參數 GRANT_SCHEMA,表示是否開啟授予和回收模式權限功能。0:否;1:是 此參數為靜態參數,默認是0,將改參數修改為1后,重啟數據庫生效。 將參數修改為1 S…

人大金倉國產數據庫與PostgreSQL

一、簡介 在前面項目中,我們使用若依前后端分離整合人大金倉,在后續開發過程中,我們經常因為各種”不適配“問題,但可以感覺得到大部分問題,將人大金倉視為postgreSQL就能去解決大部分問題。據了解,Kingba…

Python之參數星號(*)使用筆記

背景 在學習python時發現方法調用和方法定義會經常發現有帶星號的標記,為了弄明白是怎么使用的。特此做個筆記。 一、參數符號對比速查表 符號類使用場景作用描述示例無符號函數定義/調用普通位置參數或關鍵字參數.def func(a, b)*函數定義收集多余位置參數為元組…

使用haproxy實現MySQL服務器負載均衡

一、環境準備 主機名IP地址備注openEuler-1192.168.121.11mysql-server-1openEuler-2192.168.121.12mysql-server-2openEuler-3192.168.121.13clientRocky-1192.168.121.51haproxy 二、mysql-server配置 [rootopenEuler-1 ~]# yum install -y mariadb-server [rootopenEuler…

Python與Web3.py庫:構建去中心化應用的未來

Python與Web3.py庫:構建去中心化應用的未來 在區塊鏈的世界里,“去中心化”是最核心的理念之一,它賦予了用戶更多的控制權和自由,消除了傳統中心化系統中的單點故障和信任問題。而在這場技術革命中,Web3.0無疑是最受矚…

對“預訓練”的理解

預訓練有什么用 傳統的機器學習是偏數學的,對數據的量不做過多要求,而深度學習的項目通常是有大量的數據可供使用。 在平常的任務或者項目中,我們可能并沒有大量數據,只有少量數據,在這時我們就可以通過“借用”有大…

VMware Ubuntu 共享目錄

在VMware中掛載Ubuntu共享目錄需要以下步驟,分為設置共享文件夾和在Ubuntu中掛載兩部分: 一、VMware 設置共享文件夾 關閉Ubuntu虛擬機 在配置前,建議先關閉虛擬機(若已運行需關閉,部分VMware版本支持熱添加&#xff0…

AF3 crop_chains函數解讀

AlphaFold3 feature_processing_multimer模塊的crop_chains函數的功能是對多條鏈的蛋白質結構預測任務中的MSA(多序列比對)特征和模板特征進行裁剪(cropping)。裁剪的目的是為了控制輸入模型的MSA序列數量和模板數量,以適應模型的輸入限制或優化計算效率。 源代碼: def…

Java基礎-數組,集合創建方式

Java 中 new 關鍵字的作用 在 Java 中,new 關鍵字用于 在堆內存中分配空間 并創建對象。 數組 和 集合 在 Java 中都是對象,因此必須使用 new 來創建實例。Java 和 C 之間的主要區別在于 內存管理 和 對象的創建方式。 Java 與 C 中數組 & 集合的創…

LeeCode題庫第三十九題

39.組合總和 項目場景: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同…

大模型應用案例 | 大模型+金融運維,擎創攜手某證券創新運維能力新范式

一、當大模型遇上金融運維:一場讓告警處理“脫胎換骨”的變革 2022年底,ChatGPT的橫空出世讓AI技術徹底出圈;短短兩年后,大模型已悄然潛入金融行業的“心臟地帶”——運維系統。面對指數級暴增的告警信息、碎片化的處理流程&#…

【MongoDB】在Windows11下安裝與使用

官網下載鏈接:Download MongoDB Community Server 官方參考文檔:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 選擇custom類型,其他默認 注意,此選…

阿里云輕量級服務器通過寶塔安裝PgVector要點

設置環境變量: export PG_HOME/www/server/pgsql export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/www/server/pgsql/lib export PG_CONFIG/www/server/pgsql/bin/pg_config export PGDATA/www/server/pgsql/data PATH$PATH:$HOME/.local/bin:$HOME/bin:$PG_HOME/bin ali…

OpenSSL 基礎使用流程

理解 OpenSSL 的基礎使用流程是學習如何進行安全通信的關鍵,特別是在實現 SSL/TLS 連接時。以下是 OpenSSL 基礎使用流程的一個簡要總結,并附上一個簡單的示例代碼,幫助你理解如何通過 OpenSSL 建立一個基本的安全通信連接。 OpenSSL 基礎使…

什么是最終一致性,它對后端系統的意義是什么

最終一致性(Eventual Consistency)是分布式系統中的一種一致性模型。與傳統的強一致性模型不同,最終一致性并不要求系統在任何時刻都保持一致,而是保證在足夠的時間后,所有節點的數據最終會達到一致的狀態。換句話說,系統允許短時間內出現數據的不一致性,但最終會通過某…

SQL命令詳解之增刪改數據

目錄 簡介 1 添加數據 1.1 基礎語法 1.2 SQL 練習 2 修改數據 2.1 基礎語法 2.2 SQL 練習 ?3 刪除數據 3.1 基礎語法 3.2 SQL 練習 總結 簡介 在數據庫操作中,增、刪、改是最基礎的操作,它們通常對應著SQL中的INSERT、DELETE和UPDATE命令。…

std::allocator_traits 能做但 std::allocator 不能的事情

🌟 std::allocator_traits 能做但 std::allocator 不能的事情 1?? 適配自定義分配器 假設你要實現一個內存池 MyAllocator,而 STL 容器默認使用的是 std::allocator。 如果你希望 STL 容器可以使用你的 MyAllocator,你 不能直接用 std::a…