定位法/二分查找
Czy_whlg
不忘本心!
展开
-
Valid Triangle Number
1.解析题目大意,判断数组存在几个有效的三角形。2.分析刚开始,我看到这题我觉得很大可能就是定位法,可能刷题刷多啦。但我觉得数据规模有点小,暴力穷举应该没什么问题,然后就直接用了递归,可以看到,用递归实现是比较容易的,这个遍历即可。但无法OJ,我也是无语。class Solution {public: int triangleNumber(vector<i...原创 2020-02-27 20:49:57 · 270 阅读 · 0 评论 -
132 Pattern
1. 解析题目大意,判断数组是否存在子序列[a, b, c](不一定连续),使其 a < c < b2. 分析刚开始我以为是Increasing Triplet Subsequence,实际上还是有一点小差别的。这里判断的是a < c < b,不是a < b < c,思路有点类似。参考了@Grandyang的博客,他用了单调栈进行求解,即栈中...原创 2019-12-30 19:28:22 · 265 阅读 · 0 评论 -
Kth Smallest Element in a Sorted Matrix
1. 解析题目大意,在行和列有序的二维矩阵中查找第k个最小的数。2. 分析刚开始看到题目,我以为利用Search a 2D Matrix II的思路解决就可以,折腾半天发现,好像有点不太一样。其实本质还是一样的,只不过我没想出来。比较容易想到的解法就是利用优先队列priority_queue,默认是大根堆,遍历矩阵,将矩阵中的每一个元素放进堆当中,若堆中元素的个数大于k,去掉堆顶元...原创 2019-12-07 12:55:53 · 186 阅读 · 0 评论 -
Find the Duplicate Number
1. 解析题目大意,在(n+1)个元素(数值的范围为1-n)组成的数组中,查找出重复出现的元素,要求时间复杂度小于O(n^2),空间复杂度为O(1).2. 分析如果不限制空间复杂度,还是很容易想到一种解法,利用hashtable记录出现过的元素,很容易找出重复的元素,或者直接对数组进行排序,也很方便检测出重复出现的元素;其实,本题最本质是考察鸽巢原理,即将10个苹果放在9个空抽屉...原创 2019-11-20 21:31:33 · 81 阅读 · 0 评论 -
Minimum Size Subarray Sum
1. 解析题目大意,在保证连续子序列的和不小于目标值的情况下,求解子序列的最短长度2. 分析序列中的元素都是大于0的,即都是递增,所以,我们可以设置left和right左右指针,right指针往前移动,sum记录当前[left, right]范围的累和,当sum > 目标值s,缩小窗口[left, right]的范围,即left往右移动,直到sum < 目标值,则当前子...原创 2019-11-09 12:29:30 · 147 阅读 · 0 评论 -
Find Peak Element
1 解析这道题不难,比较简单,题目大意,寻找局部峰值2 思路局部峰值:nums[i-1] < nums[i] < nums[i+1] i >= 1因为左右两边的界限都是负无穷大,所以局部峰值一定会存在,我们只需从左边开始检测,当出现开始下降的元素时,那么该元素的上一个元素即为峰值。这种情况下,时间复杂度为O(n),而题目要求最好对数复杂度,所以我们可以...原创 2019-11-02 18:48:30 · 95 阅读 · 0 评论 -
Find Minimum in Rotated Sorted Array
1 解析这道题是本题的另外一种求解目标,都是同一种题型变换而来。核心还是二分查找2 分析有序序列绕着某个未知坐标旋转,而且是没有重复的数字,所以不管怎样旋转,最终序列由两段有序序列组成,这是关键,题目求解序列的最小值,那么无非就是在这两段有序序列的最小值之间选择一个值较小的。我们可以采用二分查找的思想,每次从中间元素mid开始,如果中间元素mid小于或等于最右边缘元素right,那...原创 2019-11-01 19:33:10 · 107 阅读 · 0 评论 -
Search in Rotated Sorted Array II
解析:这道题是Search in Rotated Sorted Array的改进版,出现重复元素,它们之间的区别是,重复元素的出现导致无法准确定位有序序列的范围。例如:1 1 3 4 3,根本就无法根据nums[mid]和边缘位置元素的关系判断哪一边是有序的序列。解决的方法是,将nums[mid] == 边缘位置元素这种情况单独进行判断,即出现这种关系时,只缩小边缘位置的一步距离,这样就不会忽略...原创 2019-10-14 16:11:13 · 188 阅读 · 0 评论 -
Search in Rotated Sorted Array
解析:这道题很明显就是二分查找,但和二分查找有所不同,因为序列中的元素只是部分有序的,难点在于如何定位到部分有序的序列观察可知:由于序列的元素是不重复的,故若当前位置的元素小于或者等于右边缘的元素,那么,从该位置到右边缘元素的序列就是有序序列;反之,则左边缘的元素到该位置的元素的序列是有序序列1.若nums[mid] < nums[right],那么mid-right这段序列就是有序序...原创 2019-10-14 15:48:55 · 118 阅读 · 0 评论 -
Sort Colors
解析:这道题的解法很多第一种解法:我想到的,采用直接插入排序的思想1.以j记录当前的位置,每遍历到一个元素,与已经排列好的前j-1个元素进行依次对比,直到找到和当前元素小于或者相等的位置,进行插入2.直到遍历完最后一个元素class Solution {public: void sortColors(vector<int>& nums) { ...原创 2019-10-13 13:31:17 · 78 阅读 · 0 评论 -
4Sum
解析:思想和3sum一样1.先排序,固定3个数,设置一个游标在区间移动2.若当前4个数的和小于目标值,游标向右移;若当前4个数的和大于目标值,即右边的数过大,向左移动;若相等,记录当前的值,并分别对第3和第4个数去重优化:1.若目标值小于0,且当前游标代表的值大于0,则4个数的和一定不等于目标值,结束2.若目标值大于0,且当前游标代表的值大于目标值,则4个数的和一定不等于目标值,结束...原创 2019-10-12 17:57:50 · 256 阅读 · 0 评论 -
3Sum Closest
解析:思想类似于3sum,同样采用从两边往中间靠拢的原理1.对数组进行排列,固定住左右两边的值,设置一个下标代表当前的位置,从左往右依次探索2.若当前3个数的和小于目标值target,即表示当前位置离目标值还有距离,下标往右移动,直到当前位置的值比之前的值大;若当前的和大于目标值target,即表示远离目标值,要缩小整体的范围,最右边的下标往左移动,直到当前位置的值比之前的小;若当前的和等于...原创 2019-10-12 17:03:56 · 157 阅读 · 0 评论 -
3Sum
解析:K-sums系列问题,采用定位法,确定边缘,往中间靠拢1.排序,将头尾的数确定,利用下标记录当前的位置,若当前数大于0,表示3个数相加一定大于0,结束2.若当前不是第1个数,判断和前面一个数是否重复3.若当前3个数的和大于0,最高位往左移动;小于0,最低位往右移动;如等于0,保存记录,并分别扫描左右两位是否重复class Solution {public: vector...原创 2019-10-11 20:04:04 · 444 阅读 · 0 评论