C++ 面試高頻考點 力扣 704.二分查找 基礎二分查找 題解 每日一題

文章目錄

  • 二分查找:從基礎原理到代碼實現
    • 二分查找的特點
    • 算法重點
  • 題目描述:LeetCode 704. 二分查找
  • 為什么可以用二分查找?
  • 暴力算法解法
  • 二分查找解法
    • 核心邏輯:三種情況的處理
    • 二分查找什么時候結束?
    • 為什么二分查找一定是對的?
      • 數學證明:單調性下二分查找的有效性(數學歸納法)
    • 時間復雜度
  • 代碼
  • 為什么是二分不是三分、四分?
  • 細節:這些坑別踩
  • 快速測試:你能找出這些錯誤嗎?
  • 總結+預告
    • 樸素二分模板

這是封面原圖,嘿嘿:
在這里插入圖片描述

在這里插入圖片描述

二分查找:從基礎原理到代碼實現

二分查找,這個在算法世界里算不上復雜卻總讓人在細節上栽跟頭的算法,估計不少人都有過類似經歷——明明原理一聽就懂,上手寫卻總寫出死循環,要么就是邊界條件處理得一塌糊涂。但只要真正摸透了它的規律,就會發現它其實是個“只要學會就簡單”的典型,今天咱們就借著LeetCode 704.二分查找這道基礎題,把它的來龍去脈說清楚。

在這里插入圖片描述

二分查找的特點

為啥二分查找總讓人覺得“看著簡單寫著難”?

其實核心就是細節太多
比如這些極易混淆的關鍵問題,稍不注意就會出錯:

  • 左邊界是left還是left+1
  • 右邊界該初始化成nums.size()還是nums.size()-1
  • 循環條件用left < right還是left <= right

這些小地方一旦疏忽,要么陷入死循環,要么出現漏查元素,甚至引發越界訪問,堪稱二分查找的“坑點重災區”。

但它的優點也同樣突出,尤其是在效率上的碾壓性優勢:

  • 時間復雜度O(log n),對比暴力遍歷的O(n),在數據量大時效率天差地別。

舉個直觀的例子:
要在100萬個元素中查找一個目標數:

  • 暴力遍歷:最壞情況下需要查100萬次
  • 二分查找:最壞情況下僅需20次(因為2^20≈100萬)。

這也是二分查找能成為面試高頻考點的核心原因。

算法重點

1.原理:不只是“有序”,更是“二段性”

「??核心」我們在剛開始接觸二分查找的時候經常聽說二分查找必須是數組有序的時候才能使用,其實這樣說會有些片面,其中本質不是“有序”,而是數組具有 “二段性”
至于什么是二段性簡單說就是:能找到一個 “判斷條件”,把數組分成兩部分一部分一定滿足條件,另一部分一定不滿足,這樣就說這個數組具有二段性

「??類比」 比如在書架上找一本《Python編程》,書架是按書名首字母排序的。你隨便抽一本中間的書,比如《Java編程》(首字母J),發現它在P的左邊,那你就知道《Python編程》一定在右邊——這就是生活中的“二段性”。

回到這道題,數組是升序的,“判斷條件”就可以是“元素是否小于target”:左邊的元素都小于target,右邊的元素都大于等于target(或者反過來)。正是因為有了這種“二段性”,我們才能每次拿中間元素和target比,然后果斷排除左邊或右邊的一半,不用逐個遍歷。

2.模板:理解邏輯比死記代碼重要

二分查找確實有成熟的“模板”,但千萬別死記硬背——就像手里握著卡塞爾裝備部遞來的屠龍武器,卻忘了如何激活、如何瞄準,那這把武器反而不如一把普通匕首實用(龍族亂入嘿嘿)。

常見的二分查找模板主要分為以下三種,適用場景各有不同:

模板類型核心適用場景特點
樸素二分查找查找“唯一存在的目標元素”邏輯最簡單,上手快,但局限性強,僅適用于元素無重復的場景(本文題目使用的就是該模板)
查找左邊界查找“目標元素第一次出現的位置”適用性更廣,能處理元素重復的情況,細節點更多(如邊界收縮邏輯)
查找右邊界查找“目標元素最后一次出現的位置”與左邊界模板邏輯互補,同樣適用于重復元素場景,是解決復雜查找問題的常用工具

其中,后兩種模板(左邊界、右邊界查找)功能性更萬能,但涉及的邊界處理、循環終止條件等細節也更復雜。咱們明天拆解LeetCode 34題(在排序數組中查找元素的第一個和最后一個位置)時,再逐行梳理這兩種模板的邏輯;今天的重點,是通過LeetCode 704題先把最基礎的“樸素二分查找”徹底吃透,打好根基。

題目描述:LeetCode 704. 二分查找

題目鏈接:二分查找

題目描述:
給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target  ,寫一個函數搜索 nums 中的 target,如果 target 存在返回下標,否則返回 -1。
你必須編寫一個具有  時間復雜度的算法。

示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中并且下標為 4

示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

提示:
1.你可以假設 nums 中的所有元素是不重復的。
2.n 將在 [1, 10000]之間。
3.nums 的每個元素都將在 [-9999, 9999]之間。

為什么可以用二分查找?

在討論二分查找時,我們不僅要知道“能用”,更要想清楚“為什么用”,以及“遇到隨機題目時怎么和二分關聯”——這才是掌握算法的關鍵 ?

我們先看“為什么可以用”:二分查找的核心是利用“二段性”縮小范圍,而這道題恰好完美契合這個前提→題目中的數組是升序排列的。

假設我們隨便選數組中間的元素 nums[mid],和目標值 target 對比,會立刻出現三種清晰的情況,每一種都能幫我們“砍掉”一半無用的查找范圍 🪓:

  1. 若 nums[mid] == target 🎯:直接命中答案!不需要再找了,直接返回 mid 即可;
  2. 若 nums[mid] > target 📈:因為數組是升序的,mid 右邊所有元素都會比 nums[mid] 更大,自然也比 target 大——這半邊完全不用看了,下次只查 mid 左邊;
  3. 若 nums[mid] < target 📉:同理,mid 左邊所有元素都會比 nums[mid] 更小,自然也比 target 小——這半邊可以直接舍棄,下次只查 mid 右邊。

之前提到的“二段性”,在這里也直接體現出來我們通過 midtarget 的大小關系,我們能把數組精準分成兩部分——一部分是有用的查找范圍,另一部分是可以直接扔掉的無效范圍

正因為每次都能把查找范圍縮小到原來的 1/2,二分查找才能實現 O(log n) 的高效時間復雜度,這也是它比暴力遍歷(O(n))強的根本原因 💪

暴力算法解法

既然題目要求O(log n),那肯定不能用暴力,但咱們還是先說說暴力解法,對比一下就能更直觀感受到二分的優勢。

暴力解法很簡單:從頭到尾遍歷數組,逐個比較元素和target。如果找到相等的,就返回下標;遍歷完都沒找到,就返回-1。代碼大概長這樣:

int search(vector<int>& nums, int target) {for (int i = 0; i < nums.size(); i++) {if (nums[i] == target) {return i;}}return -1;
}

這代碼肯定能跑通,但時間復雜度是O(n)——如果數組有10000個元素,最壞情況要循環10000次。現在對兩個方法的時間復雜度沒有太多概念沒有關系,后面我們會詳細說到

二分查找解法

核心邏輯:三種情況的處理

剛才其實已經說了核心思路:每次取中間元素mid,和target比,然后根據結果縮小范圍。具體來說:

  1. 初始化左右邊界:left = 0right = nums.size() - 1(因為數組下標從0開始,最后一個元素下標是size-1
  2. 循環查找:只要left <= right就證明再合法范圍內(注意這里是“<=”,后面說原因),在這個區間才能繼續計算中間下標mid
  3. 比較nums[mid]target
    • nums[mid] = target:找到目標,記錄下標,跳出循環;
    • nums[mid] > target:說明目標在左邊,把右邊界移到mid - 1(因為mid已經查過了,不用再考慮)
    • nums[mid] < target:說明目標在右邊,把左邊界移到mid + 1(同理,mid不用再考慮)
  4. 如果循環結束都沒找到,返回-1。

二分查找什么時候結束?

可能有人會想:為什么循環條件不能用left < right
比如數組只剩一個元素時,leftright相等,這時候left < right不成立,循環就結束了,那這個元素不就漏查了嗎?

比如數組[5]target是5:初始left=0right=0left <= right成立,進去計算mid=0,發現nums[mid]==target,返回0——正確。

如果target是3,數組還是[5]:第一次循環mid=0nums[mid] > target,所以right=mid-1=-1。這時候left=0right=-1left > right,循環結束,返回-1——也正確。

為什么二分查找一定是對的?

這道題中,我們可以明確數組是嚴格升序排列的,單調性極其明確——正是這個特性,為二分查找“安全縮小范圍”提供了根本保障。

只要數組滿足單調性(升序或降序),通過“中間元素 nums[mid]target 的大小對比”,就能精準劃分“有效范圍”與“無效范圍”,絕不會出現“漏查目標”的情況:

  • 若數組升序:nums[mid] > target → 右半區所有元素均 > target(無效,可舍棄);nums[mid] < target → 左半區所有元素均 < target(無效,可舍棄);
  • 若數組降序:邏輯相反,但同樣能通過一次對比砍掉一半范圍。

這種“每次縮小范圍都絕對安全”的特性,讓二分查找最終要么精準定位到目標(若存在),要么確定目標不存在——不會出現“范圍縮錯導致漏查”的問題。

數學證明:單調性下二分查找的有效性(數學歸納法)

證明目標:對于非空有序數組 nums(此處以升序為例),若 targetnums 中,則二分查找必能找到;若不在,則必能判斷不存在。

1. 基礎情況(n=1,數組僅1個元素)

  • nums[0] == target:直接返回下標0,找到目標;
  • nums[0] != target:循環結束,判斷目標不存在。
    基礎情況成立。

2. 歸納假設(假設數組長度為k時,結論成立)
即:對于長度為k的升序數組 nums,二分查找能正確判斷 target 是否存在(存在則返回下標,不存在則返回不存在)。

3. 歸納遞推(證明數組長度為k+1時,結論仍成立)
對于長度為k+1的升序數組 nums,取中間下標 mid = left + (right - left) // 2(避免溢出),對比 nums[mid]target

  • 情況1:nums[mid] == target:直接返回mid,找到目標,結論成立;
  • 情況2:nums[mid] > target:因數組升序,mid 右側(共 (k+1)-mid-1 ≤ k 個元素)均 > target,可舍棄,剩余查找范圍為 [left, mid-1](長度 ≤k)。根據歸納假設,對長度≤k的數組,二分查找能正確判斷,故結論成立;
  • 情況3:nums[mid] < target:因數組升序,mid 左側(共 mid - left ≤ k 個元素)均 < target,可舍棄,剩余查找范圍為 [mid+1, right](長度 ≤k)。同理,根據歸納假設,結論成立。

綜上,當數組長度為k+1時,結論仍成立。

由數學歸納法可知,對任意長度的有序數組,二分查找的有效性均成立——這也是“單調性”為二分查找提供的數學層面的保障。

時間復雜度

二分查找的核心優勢在于每次將查找范圍縮小為原來的 1/2,這個“減半”過程直到范圍為空或找到目標才停止。我們可以通過“查找次數”與“初始范圍大小”的對應關系,直觀看到時間復雜度為何是 O(log n)

假設初始查找范圍包含 n 個元素,每次縮小后范圍大小如下表所示(“第k次查找后”指完成第k輪對比與范圍調整后的剩余元素數):

查找輪次剩余查找范圍大小對應關系(以2的冪次表示)
初始狀態nn = 2^log?n
第1次后n/2n/2 = 2^(log?n - 1)
第2次后n/4n/4 = 2^(log?n - 2)
第3次后n/8n/8 = 2^(log?n - 3)
第k次后n/(2^k)n/(2^k) = 2^(log?n - k)
終止時≤1n/(2^k) ≤ 1 → 2^k ≥ n

當查找終止時,剩余范圍大小 ≤1(要么找到目標,要么確認目標不存在),此時滿足:
n/(2^k) ≤ 1
對不等式變形可得:
2^k ≥ n
兩邊取以2為底的對數(log?),根據對數單調性,不等號方向不變:
k ≥ log?n
由于查找次數 k 必須是整數,因此最多需要 ?log?n? 次查找(?x? 表示向上取整,如 log?100萬≈19.93,向上取整為20次)。

舉個直觀例子: 👇

  • 當 n=100萬時,log?100萬≈19.93 → 最多只需20次查找;
  • 當 n=10億時,log?10億≈29.89 → 最多只需30次查找。
    這就是“對數級復雜度”在數據量大時的壓倒性優勢。

代碼

下面是我寫的代碼,結合注釋咱們再捋一遍細節:

class Solution {
public:int search(vector<int>& nums, int target) {// 初始化左邊界為0,右邊界為數組最后一個元素的下標int right = nums.size() - 1, left = 0;// 用于記錄結果,默認-1(沒找到)int ret = -1;// 循環條件:left <= right(確保所有可能的位置都查過)while (left <= right) {  // 🌟 閉區間循環條件!別漏了"="// 計算中間下標:用left + (right - left)/2代替(left+right)/2,避免溢出int middle = left + (right - left) / 2;  // 🌟 防溢出!別寫成(right+left)/2// 如果中間元素等于target,找到目標,記錄下標并跳出循環if (nums[middle] == target) {ret = middle;break;}// 如果中間元素大于target,說明目標在左邊,右邊界左移到middle-1else if (nums[middle] > target) {right = middle - 1;}// 如果中間元素小于target,說明目標在右邊,左邊界右移到middle+1else {left = middle + 1;}}return ret;}
};

這里有個細節必須提:計算middle的時候,為什么用left + (right - left)/2而不是(left + right)/2

📌 記住:計算mid永遠用 left + (right - left)/2,不用(right+left)/2!兩者數學結果相同,但前者能避免left和right過大時的整數溢出(比如 left=2^30 ,right=2^30時,right+left會超INT_MAX)。

為什么是二分不是三分、四分?

有人可能會想:既然二分能縮小一半范圍,那三分、四分是不是更快?理論上每次縮小更多范圍,次數應該更少?

其實不一定。咱們先寫個三分查找的例子感受下:

// 三分查找示例(針對升序數組找target)
int ternarySearch(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {// 把范圍分成三份,找兩個中間點int mid1 = left + (right - left) / 3;int mid2 = right - (right - left) / 3;if (nums[mid1] == target) return mid1;if (nums[mid2] == target) return mid2;// 根據target位置縮小范圍if (target < nums[mid1]) {right = mid1 - 1;} else if (target > nums[mid2]) {left = mid2 + 1;} else {left = mid1 + 1;right = mid2 - 1;}}return -1;
}

四分查找原理類似,就是分的段更多,中間點更多。

但為什么實際中幾乎沒人用三分、四分?因為:

  • 時間復雜度差距不大:二分是O(log?n),三分是O(log?n),四分是O(log?n)。但log?n ≈ 1.58log?n ≈ 2log?n,差距很小。比如n=1e6,二分要20次,三分只要12次,四分只要10次——次數少了,但每次循環里的操作變多了(三分要算兩個中間點,判斷兩次);
  • 代碼復雜度上升:分的段越多,邊界條件越復雜,越容易出錯,維護成本高,而且一點選錯成本會更高
  • 實際效率未必更高:雖然次數少,但每次循環的計算、判斷步驟多,整體耗時可能反而比二分更長。

咱們可以寫個簡單的程序測試下(用隨機數組+多次查找計時):

#include <iostream>
#include <vector>
#include <random>
#include <chrono>using namespace std;// 二分查找
int binarySearch(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else left = mid + 1;}return -1;
}// 三分查找
int ternarySearch(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid1 = left + (right - left) / 3;int mid2 = right - (right - left) / 3;if (nums[mid1] == target) return mid1;if (nums[mid2] == target) return mid2;if (target < nums[mid1]) right = mid1 - 1;else if (target > nums[mid2]) left = mid2 + 1;else {left = mid1 + 1;right = mid2 - 1;}}return -1;
}int main() {// 生成一個100萬個元素的升序數組int n = 1000000;vector<int> nums(n);for (int i = 0; i < n; i++) {nums[i] = i;}// 隨機生成1000個目標值(確保在數組范圍內)random_device rd;mt19937 gen(rd());uniform_int_distribution<> dist(0, n-1);vector<int> targets(1000);for (int i = 0; i < 1000; i++) {targets[i] = dist(gen);}// 測試二分查找時間auto start = chrono::high_resolution_clock::now();for (int t : targets) {binarySearch(nums, t);}auto end = chrono::high_resolution_clock::now();chrono::duration<double> binaryTime = end - start;cout << "二分查找總時間:" << binaryTime.count() << "秒" << endl;// 測試三分查找時間start = chrono::high_resolution_clock::now();for (int t : targets) {ternarySearch(nums, t);}end = chrono::high_resolution_clock::now();chrono::duration<double> ternaryTime = end - start;cout << "三分查找總時間:" << ternaryTime.count() << "秒" << endl;return 0;
}

我跑了幾次,二分查找總時間大概在0.0002秒左右,三分查找大概在0.0004秒左右——反而更慢。所以除非是極特殊的場景,否則二分查找是性價比最高的選擇,大家可以親自去試一試。
在這里插入圖片描述

細節:這些坑別踩

常見問題正確做法錯誤案例(為什么錯)
右邊界初始化right = nums.size() - 1right = nums.size()(可能導致下標越界)
mid計算left + (right - left)/2(left+right)/2(left/right過大時溢出)
循環條件left <= rightleft < right(會漏掉left==right時的元素)

三個點聯動起來記:“閉區間初始化(右邊界取尾下標)+ 安全算 mid + 循環到相等”,二分查找的邊界問題基本就繞不開了

快速測試:你能找出這些錯誤嗎?

int search(vector<int>& nums, int target) {int left = 0, right = nums.size();  while (left < right) {  int mid = (left + right) / 2;  if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else left = mid + 1;}return -1;
}

答案:

  1. right應初始化為nums.size()-1
  2. 循環條件應是left <= right
  3. mid計算應是left + (right - left)/2 (也不算錯誤就是這種寫法更優)

總結+預告

今天我們從“二段性”這個核心點出發,拆解了二分查找的基礎邏輯,通過LeetCode 704題實現了樸素二分查找的代碼,也踩了右邊界初始化、mid計算溢出這些常見的“坑”。其實二分查找的本質就是“用條件劃分范圍,逐步縮小查找空間”,只要抓住這個核心,再復雜的變形也能捋清楚。

不過今天的題目里,數組元素是“不重復”的,所以找到target后直接返回即可。但如果數組里有重復元素,比如[1,2,2,3],要找2第一次出現的位置或者最后一次出現的位置,樸素二分就不夠用了——這就需要用到我們之前提到的“左邊界查找”和“右邊界查找”模板。

明天要一起研究的是 LeetCode 34題:在排序數組中查找元素的第一個和最后一個位置,有個小問題可以先想想:如果數組是[1,2,2,2,3]target=2,你覺得“左邊界”和“右邊界”分別是多少?用今天的樸素二分查找,能直接找到嗎?為什么?明天我們就用這個例子拆解“左邊界查找”的邏輯~

在這里插入圖片描述

“喏,Doro給你一朵小花🌸獎勵看到這里的你,這篇二分查找的拆解有沒有把你心里的‘小疑惑’全捋順呀?要是你覺得這篇博客把單調性、二段性這些‘小細節’講得明明白白,就給個點贊鼓勵一下嘛~ 要是怕以后找不到這么貼心的講解,可得趕緊收藏起來!不然下次遇到二分問題,Doro怕你會像Doro一樣因為找不到 Orange 時那樣‘委屈巴巴’哦~ Doro 知道這個博主后面還會扒更多算法‘小秘密’,關注他,帶你從‘看著會’到‘寫得對’,再也不被二分的細節‘背刺’啦~,最后的最后Doro把這道題的模板寫在這里了,一定要學會再用哦!👇”

樸素二分模板

while(left <= right)
{int mid = left + (right - left)/2;if(.....)//條件left = mid + 1;else if(.....)//條件right = mid -1;elsereturn .....;//找到并返回結果
}

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

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

相關文章

《UE5_C++多人TPS完整教程》學習筆記45 ——《P46 待機與跳躍動畫(Idle And Jumps)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P46 待機與跳躍動畫&#xff08;Idle And Jumps&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09…

2025年03月 Scratch 圖形化(一級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch圖形化等級考試(1~4級)全部真題?點這里 一、單選題(共25題,共50分) 第1題 氣球初始位置如下圖所示,運行下列程序,氣球會朝哪個方向移動?( ) A:水平向右 B:垂直向下 C:水平向左 D:垂直向上 答案:A 氣球水平向右移動 第2題 使用下列哪個選項可以將…

android 不同分辨圖片放錯對應文件夾會怎樣?

多年前有人問過我這個問題&#xff0c;當時沒太了解這個東西&#xff0c;覺得是無所謂的東西&#xff0c;不過沒答上來這個問題還是讓我記了很久。今天又看到有人發文章討論這個問題&#xff0c;我也就特意再研究下。1&#xff0c;了解一下Android分辨率是什么。2&#xff0c;同…

48.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--集成網關--解決Refit接口調用未授權的訪問問題

我們在項目中集成了Refit&#xff0c;但是在調用接口時&#xff0c;出現了問題&#xff0c;提示未授權的訪問。這個問題是怎么導致的呢&#xff1f;我們該怎么處理呢&#xff1f;在這篇文章中我們一起來解決吧。 一、為什么會出現這個問題 讓我們來深入分析一下是哪里返回的未授…

nacos登錄認證

先看一個現象bootstrap.yml配置如下&#xff1a;spring:application:name: myservicecloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosconfig:prefix: testfile-extension: ymlusername: nacos123password: nacos注意&#xff1a;配置中nacos…

論文閱讀:arixv 2025 WideSearch: Benchmarking Agentic Broad Info-Seeking

WideSearch&#xff1a;大規模信息檢索基準測試 https://arxiv.org/pdf/2508.07999 字節&#xff1a;Agent大規模信息獲取基準WideSearch WideSearch&#xff1a;揭示 AI 智能體缺失的「廣度」能力 Project Page: https://widesearch-seed.github.io/ get the data&#x…

【Docker基礎】Docker-compose進階配置:資源限制與高可用部署

目錄 引言 1 Docker資源限制基礎概念 1.1 為什么需要資源限制 1.2 Docker資源限制的類型 2 CPU與內存資源限制配置 2.1 傳統資源限制方式&#xff08;version 2&#xff09; 2.2 現代資源限制方式&#xff08;version 3 deploy.resources&#xff09; 關鍵參數解釋&…

SQL優化--OR

優化 SQL 中的 OR 條件是一個非常常見的性能調優問題。OR 操作符經常會導致性能下降&#xff0c;因為它使得數據庫優化器難以高效地使用索引。下面我將從淺入深地為你講解優化 OR 的多種策略&#xff0c;并附上示例。為什么 OR 性能往往較差&#xff1f;在簡單的 WHERE 子句中&…

Java試題-選擇題(21)

Java試題-選擇題(21) 題目 有關線程的敘述正確的是 ? A:可以獲得對任何對象的互斥鎖定 B:通過繼承Thread類或實現Runnable接口,可以獲得對類中方法的互斥鎖定 C:線程通過使用synchronized關鍵字可獲得對象的互斥鎖定 D:線程調度算法是平臺獨立的 下面有關forward和re…

預測模型及超參數:3.集成學習:[1]LightGBM

想象你是一位樂隊指揮&#xff0c;你的任務是協調樂隊中的每位音樂家&#xff0c;以演奏出一場完美的音樂會。每位音樂家&#xff08;即決策樹&#xff09;擅長不同的樂器或樂章。在指揮過程中&#xff0c;你通過調節各位音樂家演奏的強度&#xff08;模型參數&#xff09;&…

Jetson進行旋轉目標檢測推理實現大疆無人機飛行控制

源碼結構 大疆PSDK源碼地址&#xff1a; https://github.com/dji-sdk/Payload-SDK其目錄結構如下&#xff1a; Payload-SDK-master ├── CMakeLists.txt ├── doc │ ├── dji_sdk_code_style │ └── simple_model ├── EULA.txt ├── LICENSE.txt ├── psd…

阿里云百煉智能體連接云數據庫實踐(DMS MCP)

這篇文章主要是通過使用阿里云的百煉智能體與阿里云的serverless來實現數據庫的操作 歡迎一起交流&#xff01;&#xff01; 首先&#xff0c;當然是選擇自己需要的數據庫啦 在阿里云控制臺選擇產品 - > 數據庫 - > 數據管理DMS進來的界面如下所示 第一次進來的時候是…

某商店JS混淆補環境與純算逆向分析

文章目錄1. 寫在前面2. 接口分析3. 補環境分析4. 純算法還原【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并…

如何安裝 mysql-installer-community-8.0.21.0.tar.gz(Linux 詳細教程附安裝包下載)?

這是一個 ?Linux 下 MySQL 8.0.21 的壓縮安裝包&#xff0c;雖然名字里有 installer&#xff0c;但它其實就是一個壓縮好的二進制安裝包&#xff0c;不是 Windows 那種圖形化安裝程序。 一、準備工作 確保你已經有&#xff1a; Linux 系統&#xff08;比如 Ubuntu、CentOS、…

IDEA-琴澳研究中心及學術聯盟啟動,產研協同賦能區域發展

8月30日&#xff0c;IDEA-琴澳中心主導研發的Smaray渲染引擎將發布可免費下載的Tech Preview&#xff08;技術預覽版&#xff09;。本次發布標志著粵港澳大灣區在政產研協同創新實現成果落地&#xff0c;也是產業“人工智能”的探索邁進。Smaray是國內首個公開服務的、AI驅動的…

如何備份 TECNO 手機上的短信

許多 TECNO 用戶都在尋找方法&#xff0c;以防止因手機損壞、被盜或恢復出廠設置而導致重要對話意外丟失&#xff0c;確保在需要時能夠訪問他們的數據。還有些人希望在釋放設備存儲空間的同時&#xff0c;仍然保留舊消息的副本以供日后參考。如果你一直在尋找“備份 TECNO 短信…

OpenAI Sora深度解析:AI視頻生成技術如何重塑廣告電商行業?影業合作已落地

最近刷到一條超震撼的視頻&#xff1a;咖啡杯從桌角滑落&#xff0c;在空中轉了半圈居然自己彈回桌面&#xff0c;牛奶一滴沒灑。你猜怎么著&#xff1f;這居然是AI生成的&#xff0c;就是OpenAI那個叫Sora的工具做的。是不是覺得有點不可思議&#xff1f;現在這技術已經能做到…

力扣p1011在D天送達包裹的能力 詳解

題目如下&#xff1a;代碼如下&#xff0c;先看代碼&#xff0c;再看思路&#xff1a;注意&#xff0c;從check函數下方的left處看&#xff0c;我認為難點在于以啥來二分&#xff0c;都說求啥拿啥分&#xff0c;但實際無從下手&#xff0c;關鍵在于如何尋找邊界&#xff0c;此處…

React Three Fiber

下面&#xff0c;我們來系統的梳理關于 React Three Fiber&#xff1a;WebGL 與 React 的基本知識點&#xff1a; 一、React Three Fiber 核心概念 1.1 什么是 React Three Fiber&#xff1f; React Three Fiber&#xff08;R3F&#xff09;是一個用于 Three.js 的 React 渲染…

YARN架構解析:深入理解Hadoop資源管理核心

YARN架構解析&#xff1a;深入理解Hadoop資源管理核心 &#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土壤里生長成璀璨的銀…