1. 程式人生 > >【LeetCode】二分 binary_search(共58題)

【LeetCode】二分 binary_search(共58題)

【4】Median of Two Sorted Arrays 

【29】Divide Two Integers 

【33】Search in Rotated Sorted Array 

【34】Find First and Last Position of Element in Sorted Array 

【35】Search Insert Position 

【50】Pow(x, n) 

【69】Sqrt(x) 

【74】Search a 2D Matrix 

【81】Search in Rotated Sorted Array II 

【153】Find Minimum in Rotated Sorted Array 

【154】Find Minimum in Rotated Sorted Array II 

 

【162】Find Peak Element (2018年11月27日)(本題需要複習,一開始不會做的。我覺得二分也容易寫錯的。)

這題要求我們在一個無序的數組裡找到一個peak元素,所謂peak,就是值比兩邊鄰居大就可以了。

題解:對於這道題目,最簡單的解法就是遍歷陣列,只要找到第一個符合要求的元素就可以了,時間複雜度為O(n),但是這題要求O(LogN)的時間複雜度,還可以用二分來做。https://blog.csdn.net/NK_test/article/details/49926229

首先我們找到中間節點mid,如果大於兩邊返回當前的index就可以了,如果左邊的節點比mid大,那麼我們可以繼續在左半區間查詢,這裡面一定存在一個peak,為什麼這麼說呢?假設此時的區間範圍為[0,mid-1],因為num[mid-1]一定大於num[mid],如果num[mid-2]<=num[mid-1],那麼num[mid-1]就是一個peak。如果num[mid-2]>num[mid-1],那麼我們就繼續在[0,mid-2]區間查詢,因為num[-1]為負無窮,所以我們最終絕對能在左半區間找到一個peak。同理右半區間一樣。

 1 class Solution {
 2 public:
 3     int findPeakElement(vector<int>& nums) {
 4         const int n = nums.size();
 5         int left = 0, right = n - 1;
 6         while (left < right) {
 7             int mid = (left + right) / 2;
 8             int target = nums[mid+1];
 9             if (nums[mid] < target) {
10                 left = mid + 1;
11             } else {
12                 right = mid;
13             }
14         }
15         return left;
16     }
17 };
View Code

 

【167】Two Sum II - Input array is sorted 

【174】Dungeon Game 

【209】Minimum Size Subarray Sum 

【222】Count Complete Tree Nodes 

【230】Kth Smallest Element in a BST 

【240】Search a 2D Matrix II 

【270】Closest Binary Search Tree Value 

【275】H-Index II 

【278】First Bad Version 

【287】Find the Duplicate Number 

【300】Longest Increasing Subsequence 

【302】Smallest Rectangle Enclosing Black Pixels 

【349】Intersection of Two Arrays (2018年11月6日,演算法群相關題)

hash-table 裡面有這題,hash-table:https://www.cnblogs.com/zhangwanying/p/9886262.html

也可以二分解答,二分沒有想過,我估計就是先排序,然後二分吧

【350】Intersection of Two Arrays II (2018年11月6日,演算法群)

hash-table 裡面有這題,hash-table:https://www.cnblogs.com/zhangwanying/p/9886262.html

也可以二分解答,二分沒有想過,我估計就是先排序,然後二分吧

【354】Russian Doll Envelopes 

【363】Max Sum of Rectangle No Larger Than K 

【367】Valid Perfect Square 

【374】Guess Number Higher or Lower 

【378】Kth Smallest Element in a Sorted Matrix 

【392】Is Subsequence 

【410】Split Array Largest Sum 

【436】Find Right Interval 

 

【441】Arranging Coins (2018年11月26日)

給了 n 枚硬幣, 我們排列這些硬幣,第一行放1個,第二行放2個,.. ,第 k 行放 k 個。問這 n 個硬幣最多能完全放滿多少行。

題解:我一個解法是用 等差數列的公式求解的, k * (k + 1) <= 2 * n。 列舉 k, 找到最大滿足條件的 k,然後 返回 k . 這個解法只能 beats 20%+。

後來我看是二分的tag,我就寫了一個 二分,然後就beats 90+了。

 1 class Solution {
 2 public:
 3     int arrangeCoins(int n) {
 4         int k = my_upper_bound(1, (long long)n + 1, (long long)n * 2);
 5         return k - 1;
 6     }
 7     int my_upper_bound(int begin, long long end, long long target) {
 8         long long mid = 0;
 9         while (begin < end) {
10             mid = ((long long)begin + end) / 2;
11             long long temp = mid * (mid + 1);
12             if (temp > target) {
13                 end = mid;
14             } else {
15                 begin = mid + 1;
16             }
17         }
18         return begin;
19     }
20 };
View Code

 

【454】4Sum II 

【475】Heaters 

【483】Smallest Good Base 

【497】Random Point in Non-overlapping Rectangles 

【528】Random Pick with Weight 

【644】Maximum Average Subarray II 

【658】Find K Closest Elements 

【668】Kth Smallest Number in Multiplication Table 

【702】Search in a Sorted Array of Unknown Size 

【704】Binary Search 

【710】Random Pick with Blacklist 

【718】Maximum Length of Repeated Subarray 

【719】Find K-th Smallest Pair Distance 

【744】Find Smallest Letter Greater Than Target 

【774】Minimize Max Distance to Gas Station 

【778】Swim in Rising Water 

【786】K-th Smallest Prime Fraction 

【793】Preimage Size of Factorial Zeroes Function 

【852】Peak Index in a Mountain Array 

【862】Shortest Subarray with Sum at Least K 

【875】Koko Eating Bananas 

【878】Nth Magical Number 

【887】Super Egg Drop