leetcode 那些不像二分的二分

2021-10-22 18:41:16 字數 1364 閱讀 9869

魯迅先生曾經說過:「有的二分問題,看著不像二分,但是是真的二分,一旦二分,是真的666」

2023年3月21日leetcode周賽第三題

寫這道題是為了記錄一下這個精妙的二分+貪心解法。

class

solution

else

}return high;

}/**

*計算長度為len的陣列,並且最大值為high的最小總和

*兩種情況,len>=high:陣列可以從1到high,但這時並沒有佔滿陣列,其餘的位置補1,也就是len-high個1

* len private

long

cal_min

(long len,

long high)

return len *(2

*high-len+1)

/2;}

}

解題思路:看到這個題之後一直在想怎麼用dp方法來實現,因為他很像《演算法導論》第15章動態規劃部分的鋼條切割問題,說起來比那個限制條件要嚴格一些,也就是要分出m塊,按理說會比那個簡單。但是仔細一想,如果這麼做的話,乙個結構會對另乙個結構造成影響,因此,不能單純的這麼做。

這裡我發現了乙個神奇的解法,二分!!可以用三兩撥千金來形容,因為最終的結果值可以確定在乙個範圍內[max(nums),sum(nums)],用二分最合適不過了。

class

solution

int max = nums[0]

,sum =0;

for(

int num:nums)

if(nums.length == m)

//最終的答案所在區間[nums中的最大值,nums中所有元素的總和]

int low = max,high = sum;

while

(low(cnt>m)

else

}return high;

}}

這個題目由於之前的經驗,很容易就想到了用二分,不過很值得吐槽的是猴子可以吃那麼多香蕉,還吃的那麼快,那是猴子還是金剛啊!!!

class

solution

int low =

(int)(

(sum-1)

/h)+

1,high = max;

while

(lowif(hours>h)

else

}return high;

}}

leetcode 二分查詢

leetcode 29 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。演算法設計 用2進製的左移操作,每次對被除數左移1位,比較除數與被除數左移的後的大小關係,並在結果中加上左移...

leetcode 二分查詢

二分查詢基本實現 public intbinarysearch int nums,int key return 1 變種二分查詢,找出陣列中key重複元素最左位置 注意邊界 public intbinarysearch int nums,int key if nums l key return l ...

LeetCode 二分查詢

給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums 中並且下標為 4 示例 ...