魯迅先生曾經說過:「有的二分問題,看著不像二分,但是是真的二分,一旦二分,是真的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 示例 ...