【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