
Binary Search
文章平均质量分 66
努力努力再努力r
这个作者很懒,什么都没留下…
展开
-
Binary Search:349. Intersection of Two Arrays
求两个数组相交的数字的集合,结果中不能有重复的。想到了用setclass Solution {public: vector intersection(vector& nums1, vector& nums2) { int m = nums1.size(), n = nums2.size(); set res; vector resu原创 2017-10-20 20:49:51 · 139 阅读 · 0 评论 -
Binary Search:240. Search a 2D Matrix II
这道题让我们在一个二维数组中快速的搜索的一个数字,这个二维数组各行各列都是按递增顺序排列的,是之前那道Search a 2D Matrix 搜索一个二维矩阵的延伸,那道题的不同在于每行的第一个数字比上一行的最后一个数字大,是一个整体蛇形递增的数组。所以那道题可以将二维数组展开成一个一位数组用一次二查搜索。而这道题没法那么做,这道题有它自己的特点。如果我们观察题目中给的那个例子,我们可以发现有两个位原创 2017-10-22 11:53:03 · 171 阅读 · 0 评论 -
Binary Search:162. Find Peak Element
这道题是说,给一个数组,这个数组里有好几个局部最大值,找出一个局部最大值返回其下标。数组两边都认为是负无穷。首先想到了暴力的方法:class Solution {public: int findPeakElement(vector& nums) { int i = 1; for(; i < nums.size(); ++i) {原创 2017-10-22 15:27:08 · 178 阅读 · 0 评论 -
Binary Search:658. Find K Closest Elements
这道题给我们了一个数组,还有两个变量k和x。让我们找数组中离x最近的k个元素,而且说明了数组是有序的,如果两个数字距离x相等的话,取较小的那个。第一个方法是,设两个指针,一个指向头,一个指向尾,把与x相差大的那个删掉,如果头尾与x相差一样大,右边的删掉。class Solution {public: vector findClosestElements(vector& arr原创 2017-10-22 17:17:14 · 216 阅读 · 0 评论 -
Binary Search:74. Search a 2D Matrix
这道题的意思是,给出一个矩阵,特点是,每一行都是从小到大排序好的,每一行的第一个数都大于上一行的最后一个数。要求在这个矩阵中找target值是否存在。我的方法是,先检查每一行的第一个数,从第0行开始找,如果某一行第一个数大于target了就停下,找他的上一行有没有出现target,没有的话就返回false,有的话返回trueclass Solution {public: bo原创 2017-10-22 18:01:09 · 179 阅读 · 0 评论 -
Binary Search:275. H-Index II
根据上一题优化而来,既然是查找一个临界状态,又要求时间复杂度O(logN),用二分查找。临界条件:找到一个 citation[i] == len - i 的点; 如果 citation[i] > len - i ,说明还可以往左试探; 如果 citation[i] ,说明还可以往右试探;class Solution {public: int hIndex(vector&原创 2017-10-22 20:18:07 · 177 阅读 · 0 评论 -
Binary Search:81. Search in Rotated Sorted Array II
这道题与之前Search in Rotated Sorted Array类似,问题只在于存在dupilcate。那么和之前那道题的解法区别就是,不能通过比较A[mid]和边缘值来确定哪边是有序的,会出现A[mid]与边缘值相等的状态。所以,解决方法就是对于A[mid]==A[low]和A[mid]==A[high]单独处理。 当中间值与边缘值相等时,让指向边缘值的指针分别往前移动,忽略原创 2017-10-22 20:47:16 · 141 阅读 · 0 评论 -
Binary Search:33. Search in Rotated Sorted Array
这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。采用二分搜素,找到nums[mid]位置,如果nums[mid]>nums[left],说明left到mid是有序的,那么看target是否在left到mid这一段,在的话right = mid - 1,不在的话left = mid + 1。如果mid到right部分是有序的,那么看target是否在mid到right这一段原创 2017-10-22 21:13:57 · 253 阅读 · 0 评论 -
Binary Search:34. Search for a Range
使用两次二分查找法,第一次找到左边界,第二次调用找到右边界即可.class Solution {public: vector searchRange(vector& nums, int target) { vector res(2, -1); if(nums.empty()) return res; int left = 0, r原创 2017-10-22 21:45:36 · 174 阅读 · 0 评论 -
Binary Search:209. Minimum Size Subarray Sum
这道题意思是,给出一个数组和一个目标和s,找一个最短的连续数组,它的和大于等于s,如果没有这样的数组,返回0。首先想到的是遍历整个数组,求每个数后面不小于s的子数组的最短长度,找出最小的那个。class Solution {public: int minSubArrayLen(int s, vector& nums) { int n = nums.size();原创 2017-10-23 20:09:19 · 176 阅读 · 0 评论 -
Binary Search:222. Count Complete Tree Nodes
若是完美二叉树,节点个数很好求,为2的h次方-1,h为该完美二叉树的高度。这道题可以用递归和非递归两种方法来解。我们先来看递归的方法,思路是分别找出以当前节点为根节点的左子树和右子树的高度并对比,如果相等,则说明是满二叉树,直接返回节点个数,如果不相等,则节点个数为左子树的节点个数加上右子树的节点个数再加1(根节点),其中左右子树节点个数的计算可以使用递归来计算。/** * Definiti原创 2017-10-23 20:46:13 · 183 阅读 · 0 评论 -
Binary Search:50. Pow(x, n)
这道题让我们求x的n次方。我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。class Solution {public:原创 2017-10-23 21:01:59 · 164 阅读 · 0 评论 -
Binary Search:153. Find Minimum in Rotated Sorted Array
这道题的意思是,给出一个有序数组,从某一个节点旋转了,求整个数组中最小的数是什么。首先要判断这个有序数组是否旋转了,通过比较第一个和最后一个数的大小,如果第一个数小,则没有旋转,直接返回这个数。如果第一个数大,就要进一步搜索。我们定义left和right两个指针分别指向开头和结尾,还要找到中间那个数,然后和left指的数比较,如果中间的数大,则继续二分查找右半段数组,反之查找左半段。终止条件是原创 2017-10-22 11:18:18 · 209 阅读 · 0 评论 -
Binary Search:436. Find Right Interval
看大神分析:这道题给了我们一堆区间,让我们找每个区间的最近右区间,要保证右区间的start要大于等于当前区间的end,由于区间的顺序不能变,所以我们不能给区间排序,我们需要建立区间的start和该区间位置之间的映射,由于题目中限定了每个区间的start都不同,所以不用担心一对多的情况出现。然后我们把所有的区间的start都放到一个数组中,并对这个数组进行降序排序,那么start值大的就在数组前原创 2017-10-22 10:21:55 · 154 阅读 · 0 评论 -
Binary Search:167. Two Sum II - Input array is sorted
这道题的意思是,给一个排好序的数组,和一个目标值target, 求数组中的两个数,使得他们相加等于target,返回两个数的下标。这道题一开始没有加if(i > 0 && numbers[i] == numbers[i-1]) continue;这句话,超时了。原因是有的测试用例是{0,0,0,....,0,9,9,9....,9}target是5.class Solution {p原创 2017-10-20 21:43:23 · 164 阅读 · 0 评论 -
Binary Search:35. Search Insert Position
给出一个数组,和一个target,如果target在数组中,返回该数字的下标,如果不存在在数组中,返回插入这个数字的下标。class Solution {public: int searchInsert(vector& nums, int target) { if(nums[0] >= target) return 0; if(nums[nums原创 2017-10-21 12:38:00 · 165 阅读 · 0 评论 -
Binary Search:367. Valid Perfect Square
这道题的意思是,给出一个正整数,判断他是不是一个完全平方数,要求不能用sqrt等库函数。二分搜索的思想,先检查0~num中间的数mid的平方,如果他等于num,则是完全平方数,如果他大于num,则从left到mid中间继续找,如果他小于num, 则从mid到right中间继续找。class Solution {public: bool isPerfectSquare(int nu原创 2017-10-21 13:12:59 · 164 阅读 · 0 评论 -
Binary Search:441. Arranging Coins
这道题给了我们n个硬币,让我们按一定规律排列,第一行放1个,第二行放2个,以此类推,问我们有多少行能放满。注意low,high相加可能大于整数范围,所以要用longclass Solution {public: int arrangeCoins(int n) { if (n <= 1) return n; long low = 1, high原创 2017-10-21 14:03:09 · 146 阅读 · 0 评论 -
Binary Search:374. Guess Number Higher or Lower
这道题是一道典型的猜价格的问题,根据对方说高了还是低了来缩小范围,最简单快速的方法就是折半搜索法.注意 int mid = left + (right - left) / 2;这句话如果换成long mid = (left + right) / 2;会超时。不明白为什么。// Forward declaration of guess API.// @param num, your原创 2017-10-21 14:39:21 · 131 阅读 · 0 评论 -
Binary Search:475. Heaters
这道题的意思是,给出一个数组,里面的数字表示几个house的位置,再给出一个数组,里面的数字表示heater的位置,问heater最小半径是多少,能够保证所有house都能被heater覆盖到。这道题的思路是,为每一个house找离他最近的heater,并且把距离记录下来。把这些house的最小距离都求出来之后找里面最大的,就是最小半径。class Solution {public:原创 2017-10-21 15:37:28 · 282 阅读 · 0 评论 -
Binary Search:69. Sqrt(x)
这道题求x的平方根。注意用long long。写的时候最后一个return right总是写不对。不明白class Solution {public: int mySqrt(int x) { if(x < 2) return x; long long left = 1, right = x; while(left <= righ原创 2017-10-21 15:53:56 · 205 阅读 · 0 评论 -
Binary Search:454. 4Sum II
这道题的意思是,给出ABCD四个数组,数组大小都一样为n,从四个数组中分别抽出一个数,使得四个数相加等于0,问有多少种组合方法。这道题一开始没思路,后来看了大神做法,才觉得很巧妙。我们如果把A和B的两两之和都求出来,在哈希表中建立两数之和跟其出现次数之间的映射,那么我们再遍历C和D中任意两个数之和,我们只要看哈希表存不存在这两数之和的相反数就行了。class Solution {publ原创 2017-10-21 17:07:28 · 169 阅读 · 0 评论 -
Binary Search:378. Kth Smallest Element in a Sorted Matrix
这道题让我们求有序矩阵中第K小的元素。我们使用一个最大堆,然后遍历数组每一个元素,将其加入堆,根据最大堆的性质,大的元素会排到最前面,然后我们看当前堆中的元素个数是否大于k,大于的话就将首元素去掉,循环结束后我们返回堆中的首元素即为所求。class Solution {public: int kthSmallest(vector>& matrix, int k) {原创 2017-10-21 17:59:07 · 216 阅读 · 0 评论 -
Binary Search:230. Kth Smallest Element in a BST
这道题是求一个二叉搜索树中的第k个数是什么。受到Binary Search:378. Kth Smallest Element in a Sorted Matrix这个题的启发,我使用了一个最大堆,维护这个最大堆使得里面始终包含k个数,那么遍历完这个二叉树之后的最大堆,最大的那个就是第k个数。/** * Definition for a binary tree node. * stru原创 2017-10-21 19:32:50 · 173 阅读 · 0 评论 -
Binary Search:287. Find the Duplicate Number
大神分析:这道题给了我们n+1个数,所有的数都在[1, n]区域内,首先让我们证明必定会有一个重复数,这不禁让我想起了小学华罗庚奥数中的抽屉原理(又叫鸽巢原理), 即如果有十个苹果放到九个抽屉里,如果苹果全在抽屉里,则至少有一个抽屉里有两个苹果,这里就不证明了,直接来做题吧。题目要求我们不能改变原数组,即不能给原数组排序,又不能用多余空间,那么哈希表神马的也就不用考虑了,又说时间小于O(n2)原创 2017-10-21 21:20:13 · 187 阅读 · 0 评论 -
Binary Search:29. Divide Two Integers
这道题让我们求两数相除,而且规定我们不能用乘法,除法和取余操作,那么我们还可以用另一神器位操作Bit Operation,思路是,如果被除数大于或等于除数,则进行如下循环,定义变量t等于除数,定义计数p,当t的两倍小于等于被除数时,进行如下循环,t扩大一倍,p扩大一倍,然后更新res和m。这道题的OJ给的一些test case非常的讨厌,因为输入的都是int型,比如被除数是-2147483648,原创 2017-10-23 21:44:44 · 186 阅读 · 0 评论