代碼隨想錄第六十二天| Floyd 算法精講 A * 算法精講 (A star算法) 最短路算法總結篇

Floyd 算法精講

題目描述

小明希望在公園散步時找到從一個景點到另一個景點的最短路徑。給定公園的景點圖,包含 N 個景點和 M 條雙向道路,每條道路有已知的長度。小明有 Q 個觀景計劃,每個計劃包含一個起點和終點,求每個計劃的最短路徑長度。

輸入包含景點數量 N、道路數量 M,接著 M 行每行三個整數 u、v、w 表示景點 u 和 v 之間的雙向道路長度為 w。然后輸入觀景計劃數量 Q,接著 Q 行每行兩個整數 start 和 end。輸出每個計劃的最短路徑長度,若無路徑則輸出 -1。

輸入輸出示例

輸入:

7 3 1 2 4 2 5 6 3 6 8 2 1 2 2 3

輸出:

4 -1

解題思路

算法原理

Floyd 算法是一種多源最短路徑算法,基于動態規劃思想。通過引入中間節點逐步更新所有節點對之間的最短距離,最終得到全局最優解。該算法可以處理帶負權的圖。

動態規劃思想

  1. 狀態定義grid[i][j][k] 表示從節點 i 到節點 j,只能經過節點 1 到 k 的最短距離。
  2. 狀態轉移grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]),即不經過節點 k 或經過節點 k 的最小值。
  3. 初始化:初始時,grid[i][j][0] 為直接連接的邊的權值,其他為無窮大。
  4. 遍歷順序:按 k、i、j 的順序遍歷,確保每一步都基于之前的結果。

空間優化

由于每次計算只依賴前一次的結果,可以將三維數組優化為二維數組,減少空間復雜度。

代碼實現

import java.util.Scanner;public class FloydAlgorithm {public static final int MAX_VAL = 10005; // 邊的最大距離public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 景點數量int m = sc.nextInt(); // 道路數量// 初始化距離矩陣int[][] grid = new int[n + 1][n + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {grid[i][j] = MAX_VAL; // 初始化為最大值}}// 輸入道路信息for (int i = 0; i < m; i++) {int u = sc.nextInt();int v = sc.nextInt();int w = sc.nextInt();grid[u][v] = w; // 雙向道路grid[v][u] = w;}// Floyd 算法核心部分for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {// 更新 i 到 j 的最短路徑if (grid[i][k] + grid[k][j] < grid[i][j]) {grid[i][j] = grid[i][k] + grid[k][j];}}}}// 處理觀景計劃int q = sc.nextInt(); // 計劃數量for (int i = 0; i < q; i++) {int start = sc.nextInt();int end = sc.nextInt();if (grid[start][end] == MAX_VAL) {System.out.println(-1); // 無路徑} else {System.out.println(grid[start][end]); // 最短路徑長度}}}
}

代碼注釋

  1. 初始化距離矩陣grid[i][j] 初始化為最大值,表示初始時無路徑。
  2. 輸入道路信息:讀取每條道路并更新距離矩陣,雙向道路需兩邊更新。
  3. Floyd 算法核心:三重循環,逐步引入中間節點 k,更新所有節點對的最短路徑。
  4. 處理觀景計劃:對每個計劃查詢最短路徑,若仍為最大值則輸出 -1,否則輸出路徑長度。

總結

Floyd 算法通過動態規劃思想,利用三維數組逐步更新節點間的最短路徑。空間優化后使用二維數組,時間復雜度為 O(n^3),適合稠密圖或多源最短路徑問題。理解動態規劃的狀態轉移和遍歷順序是掌握該算法的關鍵。

A* 算法精講

題目描述

在象棋中,騎士(馬)按照“日”字形移動。給定騎士的起始坐標和目標坐標,計算從起點到達目標點所需的最短步數。棋盤大小為 1000x1000。

輸入包含多個測試用例,每行給出起點和目標點的坐標。輸出每個測試用例的最短步數。

輸入輸出示例

輸入:

6
5 2 5 4
1 1 2 2
1 1 8 8
1 1 8 7
2 1 3 3
4 6 4 6

輸出:

2
4
6
5
1
0

解題思路

算法原理

A* 算法是一種啟發式搜索算法,結合了廣度優先搜索(BFS)和迪杰斯特拉算法(Dijkstra)的優點,通過引入啟發式函數來指導搜索方向,從而提高搜索效率。

關鍵點

  • 啟發式函數:用于估計當前節點到目標節點的距離,指導搜索方向。常見的啟發式函數包括曼哈頓距離、歐氏距離和切比雪夫距離。本題采用歐氏距離。
  • 優先級隊列:根據啟發式函數計算的值(F = G + H)對節點進行排序,優先擴展最有可能接近目標的節點。
  • 節點狀態記錄:記錄已訪問節點的步數,避免重復訪問。

代碼實現

import java.util.*;
import java.awt.Point;
import java.util.PriorityQueue;public class KnightAttack {// 定義騎士的8個可能移動方向private static final int[][] MOVES = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2},{1, -2}, {1, 2}, {2, -1}, {2, 1}};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();for (int i = 0; i < n; i++) {int a1 = scanner.nextInt();int a2 = scanner.nextInt();int b1 = scanner.nextInt();int b2 = scanner.nextInt();System.out.println(astar(new Point(a1, a2), new Point(b1, b2)));}}private static int astar(Point start, Point end) {// 優先級隊列,存儲 (總代價, 當前位置, 已走步數)PriorityQueue<Node> heap = new PriorityQueue<>((a, b) -> Double.compare(a.f, b.f));heap.add(new Node(start, 0, heuristic(start, end)));// 記錄訪問過的節點及其步數Map<Point, Integer> visited = new HashMap<>();visited.put(start, 0);while (!heap.isEmpty()) {Node current = heap.poll();// 檢查是否到達目標if (current.point.equals(end)) {return current.steps;}// 生成下一個可能的移動位置for (int[] move : MOVES) {Point nextPoint = new Point(current.point.x + move[0], current.point.y + move[1]);// 檢查是否在棋盤范圍內if (nextPoint.x >= 1 && nextPoint.x <= 1000 && nextPoint.y >= 1 && nextPoint.y <= 1000) {int newSteps = current.steps + 1;// 如果該位置未被訪問或有更短路徑if (!visited.containsKey(nextPoint) || newSteps < visited.get(nextPoint)) {visited.put(nextPoint, newSteps);double f = newSteps + heuristic(nextPoint, end);heap.add(new Node(nextPoint, newSteps, f));}}}}// 如果無法到達目標return -1;}private static double heuristic(Point start, Point end) {// 歐氏距離啟發式函數double dx = start.x - end.x;double dy = start.y - end.y;return Math.sqrt(dx * dx + dy * dy);}private static class Node {Point point;int steps;double f; // 總代價:f = steps + heuristicNode(Point point, int steps, double f) {this.point = point;this.steps = steps;this.f = f;}}
}

代碼注釋

  1. 移動方向定義:騎士有8個可能的移動方向,用 moves 數組表示。
  2. 啟發式函數heuristic 函數計算兩個點之間的歐氏距離,作為估計距離。
  3. A 搜索函數*:astar 函數使用優先級隊列進行搜索,每次擴展最有可能接近目標的節點。
  4. 優先級隊列:隊列中存儲元組 (總代價, 當前位置x, 當前位置y, 已走步數),按總代價排序。
  5. 訪問記錄visited 字典記錄已訪問節點及其最小步數,避免重復訪問。
  6. 輸入處理:讀取多個測試用例,對每個用例調用 astar 函數計算最短步數。

總結

A* 算法通過引入啟發式函數,能夠在大規模地圖上高效地找到最短路徑。相比傳統的廣度優先搜索(BFS),A* 算法通過優先擴展接近目標的節點,減少了不必要的搜索,提高了效率。選擇合適的啟發式函數對算法性能至關重要。

最短路算法總結

至此已經講解了四大最短路算法,分別是 Dijkstra、Bellman-Ford、SPFA 和 Floyd。

針對這四大最短路算法,我用了七篇長文才徹底講清楚,分別是:

  • Dijkstra 樸素版
  • Dijkstra 堆優化版
  • Bellman-Ford
  • Bellman-Ford 隊列優化算法(又名 SPFA)
  • Bellman-Ford 算法判斷負權回路
  • Bellman-Ford 之單源有限最短路
  • Floyd 算法精講
  • 啟發式搜索:A * 算法

最短路算法比較復雜,而且各自有各自的應用場景。以下是講過的最短路算法的使用場景對比表:

算法適用場景特點
Dijkstra單源且邊為正數效率高,適合稀疏圖和稠密圖的不同版本
SPFA單源邊可為負數一般情況下比 Bellman-Ford 效率高,適合大部分場景
Bellman-Ford單源邊可為負數,需判斷負權回路可以檢測負權回路,代碼實現相對簡單
Floyd多源點求最短路適合節點數量較少的情況,實現簡單

(因為 A * 屬于啟發式搜索,和上面最短路算法并不是一類,不適合一起對比,所以沒有放在一起)

可能有同學感覺:這個表太復雜了,我記也記不住。

其實記不住的原因還是對這幾個最短路算法沒有深刻的理解。這里給大家一個大體使用場景的分析:

  • 如果遇到單源且邊為正數,直接 Dijkstra。至于使用樸素版還是堆優化版,還是取決于圖的稠密度。多少節點多少邊算是稠密圖,多少算是稀疏圖,這個沒有量化。如果想量化,只能寫出兩個版本然后做實驗去測試,不同的判題機得出的結果還不太一樣。一般情況下,可以直接用堆優化版本。
  • 如果遇到單源邊可為負數,直接 Bellman-Ford。同樣 SPFA 還是 Bellman-Ford 取決于圖的稠密度。一般情況下,直接用 SPFA。
  • 如果有負權回路,優先 Bellman-Ford。如果是有限節點最短路,也優先 Bellman-Ford,理由是寫代碼比較方便。
  • 如果是遇到多源點求最短路,直接 Floyd。除非源點特別少,且邊都是正數,那可以多次 Dijkstra 求出最短路徑,但這種情況很少。一般出現多個源點了,就是想讓你用 Floyd 了。
  • 對于 A *,由于其高效性,在實際工程應用中使用最為廣泛。由于其結果的不唯一性,也就是可能是次短路的特性,一般不適合作為算法題。游戲開發、地圖導航、數據包路由等都廣泛使用 A * 算法。

圖論總結

從深搜廣搜到并查集,從最小生成樹到拓撲排序,最后是最短路算法系列。

至此算上本篇,一共30篇文章,圖論之旅就在此收官了。

在0098.所有可達路徑,我們接觸了兩種圖的存儲方式,鄰接表和鄰接矩陣,掌握兩種圖的存儲方式很重要。

圖的存儲方式也是大家習慣在核心代碼模式下刷題經常忽略的知識點。因為在力扣上刷題不需要掌握圖的存儲方式。

深搜與廣搜

在二叉樹章節中,其實我們講過了深搜和廣搜在二叉樹上的搜索過程。

在圖論章節中,深搜與廣搜就是在圖這個數據結構上的搜索過程。

深搜與廣搜是圖論里基本的搜索方法,大家需要掌握三點:

  • 搜索方式:深搜是一個方向搜,不到黃河不回頭。廣搜是圍繞起點一圈一圈的去搜。
  • 代碼模板:需要熟練掌握深搜和廣搜的基本寫法。
  • 應用場景:圖論題目基本上可以用深搜也可用廣搜,看哪個方便而已。

注意事項

需要注意的是,同樣是深搜模板題,會有兩種寫法。

在0099.島嶼的數量深搜.md和0105.有向圖的完全可達性,涉及到dfs的兩種寫法。

我們對dfs函數的定義是處理當前節點還是處理下一個節點很重要,決定了兩種dfs的寫法。

這也是為什么很多錄友看到不同的dfs寫法,結果發現提交都能過的原因。

而深搜還有細節,有的深搜題目需要用到回溯的過程,有的就不用回溯的過程,

一般是需要計算路徑的問題需要回溯,如果只是染色問題(島嶼問題系列)就不需要回溯。

例如:0105.有向圖的完全可達性深搜就不需要回溯,而0098.所有可達路徑中的遞歸就需要回溯,文章中都有詳細講解

注意:以上說的是不需要回溯,不是沒有回溯,只要有遞歸就會有回溯,只是我們是否需要用到回溯這個過程,這是需要考慮的。

很多錄友寫出來的廣搜可能超時了,例如題目:0099.島嶼的數量廣搜

根本原因是只要加入隊列就代表走過,就需要標記,而不是從隊列拿出來的時候再去標記走過。

具體原因,我在0099.島嶼的數量廣搜中詳細講了。

在深搜與廣搜的講解中,為了防止慣性思維,我特別加入了題目0106.島嶼的周長,提醒大家,看到類似的題目,也不要上來就想著深搜和廣搜。

還有一些圖的問題,在題目描述中,是沒有圖的,需要我們自己構建一個圖,例如0110.字符串接龍,題目中連線都沒有,需要我們自己去思考什么樣的兩個字符串可以連成線。

并查集

并查集相對來說是比較復雜的數據結構,其實他的代碼不長,但想徹底學透并查集,需要從多個維度入手,

我在理論基礎篇的時候講解如下重點:

  • 為什么要用并查集,怎么不用個二維數據,或者set、map之類的。
  • 并查集能解決那些問題,哪些場景會用到并查集
  • 并查集原理以及代碼實現
  • 并查集寫法的常見誤區
  • 帶大家去模擬一遍并查集的過程
  • 路徑壓縮的過程
  • 時間復雜度分析

上面這幾個維度大家都去思考了,并查集基本就學明白了。

其實理論基礎篇就算是給大家出了一道裸的并查集題目了,所以在后面的題目安排中,會稍稍的拔高一些,重點在于并查集的應用上。

例如并查集可以判斷這個圖是否是樹,因為樹的話,只有一個根,符合并查集判斷集合的邏輯,題目:0108.冗余連接。

在0109.冗余連接II中對有向樹的判斷難度更大一些,需要考慮的情況比較多。

最小生成樹

最小生成樹是所有節點的最小連通子圖,即:以最小的成本(邊的權值)將圖中所有節點鏈接到一起。

最小生成樹算法,有prim和kruskal。

prim算法是維護節點的集合,而Kruskal是維護邊的集合。

在稀疏圖中,用Kruskal更優。在稠密圖中,用prim算法更優。

邊數量較少為稀疏圖,接近或等于完全圖(所有節點皆相連)為稠密圖

Prim算法時間復雜度為O(n^2),其中n為節點數量,它的運行效率和圖中邊樹無關,適用稠密圖。

Kruskal算法時間復雜度為O(nlogn),其中n為邊的數量,適用稀疏圖。

關于prim算法,我自創了三部曲,來幫助大家理解:

第一步,選距離生成樹最近節點

第二步,最近節點加入生成樹

第三步,更新非生成樹節點到生成樹的距離(即更新minDist數組)

大家只要理解這三部曲,prim算法至少是可以寫出一個框架出來,然后在慢慢補充細節,這樣不至于自己在寫prim的時候兩眼一抹黑完全憑感覺去寫。

minDist數組是prim算法的靈魂,它幫助prim算法完成最重要的一步,就是如何找到距離最小生成樹最近的點。

kruscal的主要思路:

  • 邊的權值排序,因為要優先選最小的邊加入到生成樹里
  • 遍歷排序后的邊
  • 如果邊首尾的兩個節點在同一個集合,說明如果連上這條邊圖中會出現環
  • 如果邊首尾的兩個節點不在同一個集合,加入到最小生成樹,并把兩個節點加入同一個集合

而判斷節點是否在一個集合以及將兩個節點放入同一個集合,正是并查集的擅長所在。

所以Kruskal是需要用到并查集的。

這也是我在代碼隨想錄圖論編排上為什么要先講解并查集在講解最小生成樹。

拓撲排序

拓撲排序是在圖上的一種排序。

概括來說,給出一個有向圖,把這個有向圖轉成線性的排序就叫拓撲排序。

同樣,拓撲排序也可以檢測這個有向圖是否有環,即存在循環依賴的情況。

拓撲排序的一些應用場景,例如:大學排課,文件下載依賴等等。

只要記住如下兩步拓撲排序的過程,代碼就容易寫了:

  • 找到入度為0的節點,加入結果集
  • 將該節點從圖中移除

最短路算法

最短路算法是圖論中,比較復雜的算法,而且不同的最短路算法都有不同的應用場景。

我在最短路算法總結篇里已經做了一個高度的概括。

大家要時常溫故而知新,才能透徹理解各個最短路算法。

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

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

相關文章

如何避免測試環境不穩定導致的誤報

避免測試環境不穩定導致誤報的核心方法包括搭建獨立穩定的測試環境、使用環境監控工具、建立環境變更管理機制、定期維護更新測試環境以及提升團隊的環境管理意識。 其中&#xff0c;搭建獨立穩定的測試環境尤為關鍵。獨立的測試環境能有效隔離其他環境的干擾&#xff0c;保證測…

初級:I/O與NIO面試題深度剖析

一、引言 在Java開發中&#xff0c;I/O&#xff08;輸入/輸出&#xff09;操作是程序與外部設備&#xff08;如磁盤、網絡等&#xff09;進行數據交互的重要方式。傳統的I/O模型在處理大規模數據和高并發場景時存在一定的局限性&#xff0c;而NIO&#xff08;New I/O&#xff…

Axure RP9教程 :輪播圖(動態面板) | 頭部鎖定

文章目錄 引言I 輪播圖操作步驟在畫布中添加一個動態面板設置面板狀態II 頭部鎖定將頭部區域選中,右鍵組合或用Ctrl+G快捷鍵;將組合的頭部區域,右鍵創建動態面板;引言 動態面板的功能十分強大,比如:擁有獨立的內部坐標系,有多個狀態; Banner的案例中會用到動態面板多個…

超微服務器主板重置ipmi登錄密碼

超微服務器主板重置ipmi登錄密碼 超微服務器的ipmi登錄密碼不對&#xff0c;需要重置但是bios內并沒有找到可以設置的選項。 以下是解決辦法&#xff1a; 安裝IPMITOOL apt install ipmitool -y執行以下命令加載模塊&#xff1a; modprobe ipmi_watchdog modprobe ipmi_po…

藍橋杯第十屆 數的分解

題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 把 2019 分解成 3 個各不相同的正整數之和&#xff0c;并且要求每個正整數都不包含數字 2 和 4&#xff0c;一共有多少種不同的分解方法&#xff1f; 注意交換 3 個…

Docker入門篇4:查看容器資源、查看容器詳細信息、查看容器日志、查看容器內運行的進程

大家好我是木木&#xff0c;在當今快速發展的云計算與云原生時代&#xff0c;容器化技術蓬勃興起&#xff0c;Docker 作為實現容器化的主流工具之一&#xff0c;為開發者和運維人員帶來了極大的便捷 。下面我們一起開始入門第四篇&#xff1a;查看容器資源、查看容器詳細信息、…

基于數據挖掘的網絡入侵檢測關鍵技術研究

標題:基于數據挖掘的網絡入侵檢測關鍵技術研究 內容:1.摘要 隨著互聯網的迅速發展&#xff0c;網絡安全問題日益嚴峻&#xff0c;網絡入侵行為對個人、企業和國家的信息安全構成了巨大威脅。本文的目的是研究基于數據挖掘的網絡入侵檢測關鍵技術&#xff0c;以提高網絡入侵檢測…

中學數學幾百年重大錯誤:將無窮多各異假R誤為R——兩數集相等的必要條件

中學數學幾百年重大錯誤&#xff1a;將無窮多各異假R誤為R——兩數集相等的必要條件 黃小寧 設集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;相應變量x的變域是A。其余類推。本人多年前公開發表的論文中有定理&#xff1a; h定理&#xff08;兩數集相等的必要條…

react-activation 實現頁面保活記錄

這里寫目錄標題 一、安裝插件&#xff08;可選&#xff09;1、react-activation &#xff08;推薦&#xff09;2、umi-plugin-keep-alive 二、AliveScope的兩種配置方式1、在src/app.ts 中配置2、在src/layout/index.tsx中配置 三、umi中的配置四、使用問題記錄1、drop使用不生…

STM32使用紅外避障傳感器

1.1 介紹&#xff1a; 該傳感器模塊對環境光適應能力強&#xff0c;其具有一對紅外線發射與接收管&#xff0c;發射管發射出一定頻率的紅外線&#xff0c;當檢測方向遇到障礙物&#xff08;反射面&#xff09;時&#xff0c;紅外線反射回來被接收管接收&#xff0c;經過比較器…

python tkinter 開發蓍草占卜系統

1. 項目概述 1.1 簡介 蓍草占卜是中國傳統的占卜方法&#xff0c;用于演算六十四卦。本系統通過現代編程技術&#xff0c;將傳統的蓍草占卜方法數字化&#xff0c;提供一個準確、便捷的占卜工具。 蓍草占卜&#xff0c;作為中國古代的一種傳統占卜方法&#xff0c;承載著深厚…

Linux搭建本地時間服務器及時間同步

搭建一個本地時間服務器&#xff0c;使得局域網內主機時間保持一致。 設置正確時間 # 設置系統時間 date -s "2025-03-25 17:31:00" # 將系統時間寫入硬件時鐘 hwclock --systohc時間服務器設置 系統應該預先安裝chronyd 要允許 所有客戶端 通過你的 chronyd 服務器…

2025-3-25算法打卡

一&#xff0c;走迷宮 1.題目描述&#xff1a; 給定一個 NMNM 的網格迷宮 GG。GG 的每個格子要么是道路&#xff0c;要么是障礙物&#xff08;道路用 11 表示&#xff0c;障礙物用 00 表示&#xff09;。 已知迷宮的入口位置為 (x1,y1)(x1?,y1?)&#xff0c;出口位置為 (x…

力扣刷題39. 組合總和

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; 需要定義一個index變量用來記錄訪問數組的下標&#xff0c;每次遞歸進行傳參&#xff0c;在搜索過程中&#xff0c;因為為了避免重復數據&#xff0c;而且允許一個元素的重復出現&#xff0c;傳入index時傳入當前遍歷的i…

ISIS-3 LSDB鏈路狀態數據庫同步

上一章我們介紹了ISIS的鄰居建立關系以及ISIS的路由器角色有哪些,在不同的網絡類型當中建立鄰居關系有什么不同,并且以實驗案例抓包的形式給大家進一步介紹了建立的過程。 這一章我們來介紹ISIS中是如何實現鏈路狀態數據庫同步的,與OSPF的鏈路狀態同步有什么不同,在不同網絡類…

Opencv計算機視覺編程攻略-第三節 圖像顏色處理

第三節 圖像顏色處理 1.顏色比較2.GrabCut分割圖像3.色調、飽和度以及亮度 1.顏色比較 主要實現逐像素的顏色比較&#xff0c;其中注意BGR顏色空間不連續&#xff0c;不利于顏色提取和區分&#xff0c;轉換到Lab空間&#xff1a; int getColorDistance(const cv::Vec3b& c…

BoomCut AI 技術創建本地化的營銷視頻

目錄 視頻翻譯實驗 交換實驗 數字人實驗 核心功能與技術亮點 適用場景 BoomCut 提供用于視頻翻譯、數字人等的 AI 技術,以快速創建本地化的營銷視頻 視頻翻譯實驗 電影電影哪吒之魔童降世換成西班牙語

論華為 Pura X 折疊屏性能檢測

在科技浪潮中&#xff0c;折疊屏手機以其創新形態掀起市場熱潮。華為 Pura X 作為華為最新折疊手機&#xff0c;承載前沿科技與精湛工藝&#xff0c;成為行業焦點。它融合先進折疊屏技術與優質材質&#xff0c;致力于打破傳統手機使用邊界&#xff0c;為用戶開啟全新體驗。但產…

【藍橋杯每日一題】3.25

&#x1f3dd;?專欄&#xff1a; 【藍橋杯備篇】 &#x1f305;主頁&#xff1a; f狐o貍x “OJ超時不是終點&#xff0c;是算法在提醒你該優化時間復雜度了&#xff01;” 目錄 3.25 差分數組 一、一維差分 題目鏈接&#xff1a; 題目描述&#xff1a; 解題思路&#xff1a;…

3.25學習總結 抽象類和抽象方法+接口+內部類+API

抽象類和抽象方法&#xff1a; 有抽象方法&#xff0c;那么類肯定是抽象類。父類不一定是抽象的&#xff0c;但如果父類中有抽象方法那一定是抽象類。 如果子類中都存在吃這個行為&#xff0c;但吃的具體東西不同&#xff0c;那么吃這個行為定義在父類里面就是抽象方法&#x…