有趣的二分

2022-07-16 10:36:08 字數 1387 閱讀 6354

對演算法一直很陌生, 以後也會很陌生, 因為我是程式設計師,而不是數學家或者演算法工程師

可這阻止不了演算法的有趣.

先有了 快慢指標,讓人眼前一亮, 而後這裡的二分方法又讓人 乙個激動

二分的方法很簡單, 上來就是去找你的一半去, 快速定位.

整理的複雜度也會跟 快速排序等方法有得一拼.

二分的關鍵, 是找到中間的, 然後對中間的進行目標比較, 然後繼續中間劃分

這個獲取中間的場景隨著頭尾的變動, 所以也是變動的.我們要跟隨著使用的場景去修改頭尾

比較經典的場景就是去尋找乙個數的插入位置. 這裡有乙個數字, 這裡有乙個數字, 我需要快速的找到這個數字應該插入的位置

//這個陣列是假定已經排好順序的, 這樣這個二分才有意義

//定義好左右位置

//const target = 3.5

const arr = [1,2,3,4,5]

let l = arr.length;

let i = 0, // 最左側的位置

j = l - 1; //最右側的位置

let mid = i + math.floor((j-i)/2) // 或者可以使用位移 (j-i)>>1

let ret = l; //暫定我們要返回的就是最後乙個點

//直接選擇中間的位置進行比較,

arr[mid] > target

//如果中間的位置的數值比目標大, 那麼數值肯定在中間以左, 我們需要修改右側的位置(相對的mid也會變動)

j = mid - 1;

//如果相等, 那麼正好, 我們要的目標就是這個地方

ret = mid;

//同理, 如果中間的位置小, 那麼數字肯定在中間以右, 我們需要修改左側的位置

i = mid + 1

//step2:

//因為正常情況下, 我們認為我們的元素是從小到大金星排列的, 所以正常的時候, 插入位置在右側(>=)

//所以上邊的判斷可以合併

arr[mid] >= target

ret = mid

j = mid -1

//每次修改後, 我們需要重新計算 `mid`, 所以我們將方法進行整理後 ,如下

//左側索引小於右側, i = j, 也可以, 代表我們的遍歷還是有元素的

while (i <= j)

else

}//step3: 我們整理成完整的方法

function findposition(arr, target)

else

}return ret;

}

二分的模板(花式二分)

對於不下降序列a,n為序列a元素的個數,key為關鍵字 1.求最小的i,使得a i key,若不存在,則返回 1 int binary search 1 inta,intn int key if a r key returnr return 1 2.求最大的i,使得a i key,若不存在,則返回 ...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

leetcode 那些不像二分的二分

魯迅先生曾經說過 有的二分問題,看著不像二分,但是是真的二分,一旦二分,是真的666 2021年3月21日leetcode周賽第三題 寫這道題是為了記錄一下這個精妙的二分 貪心解法。class solution else return high 計算長度為len的陣列,並且最大值為high的最小總和...