這乙個月努力沖一沖,三月份的甲級能考掉就考掉了。
今天看演算法筆記看到了二分,想著二分還不簡單。看了看發現並不是?
演算法筆記中有一句加粗的話是我以前在二分中從沒聽過的,大部分二分問題可以歸結為:尋找有序序列中第乙個滿足某條件的元素的位置。這句話一開始聽得不明所以,仔細一想別有洞天。
比如下面的木棒切割問題:
#include
using
namespace std;
int n;
//木棒數量
int stick[
110]
;int m;
//要幾根
int l =1;
int r;
intmain()
} cin >> m;
int mid;
int sum;
while
(l < r)
if(sum < m)
else}
cout << l -
1<< endl;
cout << r -1;
return0;
}
這道題找的就是第乙個不滿足條件的長度,再減去一就是答案。
這裡將第乙個不滿足條件的長度看為目標。
於是乎上題中,if裡的就是不滿足條件的長度這種情況發生,也就是切割出來的木棒比要求的少。
if
(sum < m)
else
那如何理解上面的五行**就能得到目標呢?這裡的l,r都是閉區間。
當滿足條件時,因為要找的是第乙個滿足條件的,所以還要往前繼續找,而且mid也可能就是目標,所以滿足條件時: r = mid;
而如果mid不滿足時,那前面的也不可能滿足了,所以要將前面的都捨棄,考慮後面的,所以 l = mid + 1;
2019 08 08 二分思想
今天做了一道二分題 感覺二分仍需要加強 乙個經典題目 求乙個遞增陣列裡某個數字出現次數 我們第一想法 暴力 的確可以 邊讀入邊判斷是否為我們要的那個數 這種複雜度是o n 有沒有更高效演算法呢?二分!我們可以二分查詢陣列中這個數出現的第乙個位置和最後乙個位置 數量不就得出來了嗎 那麼怎麼二分呢?我們...
二分查詢思想
二分查詢思想應用於對有序的陣列進行查詢操作。時間複雜度 二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性演算法時間複雜度為o logn mid計算 有兩種計算中值mid的方式 l h可能出現加法溢位,也就是說加法的結果大於整形能夠表示的範圍。但是l和h都為正數,因此h l不會出現加法溢位...
二分查詢的思想
先看看leetcode兩道相關的題目,都是二分思想的應用。leetcode 35 leetcode 34 二分思想用一句話概況就是 一看就懂,一寫就廢 花了很長時間都沒有弄得懂,每個人都是不同的寫法,新手很難從中發現規律。其實二分查詢最重要的一句話就是 查詢範圍 如何確定查詢範圍?只要確定了查詢範圍...