twoPointer
文章平均质量分 50
Lzed
我好菜啊
展开
-
Leetcode 228 - Summary Ranges(Two pointers)
题意求数组内所有连续的范围。思路用两个指针i和j,分别指向每个范围的开始位置和结束位置就好。然后去遍历数组。string to_string(int x):将x转化为一个string返回。细节注意只有一个元素或者j指向最后一个元素的情况。因此我们在遍历数组的时候,可以用j == n作为终止条件,并且终止条件特判一下避免出错。代码class Solution {private: vector原创 2017-02-17 16:16:49 · 195 阅读 · 0 评论 -
Leetcode 15 - 3Sum(双指针)
题意给一个数组,要求求数组里面所有的a, b, c,使得a + b + c = 0,要求解不重复。思路算法1排序 + 二分。先排序,然后枚举a和b,那么c = -a - b,然后二分查找一下c。时间复杂度O(n2logn)O(n^2logn)注意去重:只要a和b不重复,那么c一定不会重复,于是枚举a和b时要跳过相同的值。算法2枚举 + Hash我们用unordered_map存储每个元素出现的最后一原创 2017-02-23 08:47:27 · 239 阅读 · 0 评论 -
Leetcode 209 - Minimum Size Subarray Sum(二分 or 双指针)
题意给一个数组a[]和一个数s,要求在a里面找到一个长度最短的连续子序列,并且子序列的和大于等于s。思路算法1前缀和 + 二分。时间复杂度O(nlogn)O(nlogn)。我们先维护一个前缀和ss,然后遍历ss里面的元素ss[i],那么我们另一个需要的前缀和ssjss_j应该满足ssj≤ssi−sss_j \leq ss_i - s。于是我们二分查找一下满足条件的ssjss_j即可。算法2双指针。时原创 2017-02-12 20:35:57 · 291 阅读 · 0 评论 -
Leetcode 11 - Container With Most Water(two pointers)
题意给定一堆竖着的线,找两条线,使这两条线围城的容器的面积最大。思路首先,我们先贪心的去考虑:假设我们直接取最两边的两条线i和j,能否获得最大高度?显然是不一定的。然后,我们去需要取移动两边的选取i和j了。然后基于如下事实:若ai<aja_i <a_j,那么我们向左移动j不会更新最优解。因为此时的面积S=ai(j−i)S = a_i(j - i),并且若向左移动j到k的位置,那么此时的面积S′=mi原创 2017-02-20 20:41:02 · 228 阅读 · 0 评论 -
Leetcode88 - Merge Sorted Array(two pointers)
题意就归并排序的归并:给定两个数组1和2,将2归并到1。思路如果新开空间的话还是很好做的,但是既然说了1的大小可以容纳下2,我们就考虑把2归并到1里面。开始是想法是两个数组都从第一个元素开始归并,但是存在这样一个问题:会覆盖掉1里面的元素= =。其实从两个数组的最后一个元素开始归并,因为1的后面是空出来的,因此,我们从m + n - 1的位置开始放元素,可以保证元素不会被覆盖掉。代码class So原创 2017-01-19 23:28:04 · 213 阅读 · 0 评论 -
Leetcode75 - Sort Colors(two pointers)
题意给定一个数组,只包含0,1,2,将0,1,2按照顺序排列。要求: 1. 只能开常数空间 2. 对数组只扫描一遍思路算法1算法1是最容易想到的,我们扫描一遍数组统计一下每个数字的数目,然后再扫描一遍填进去即可。算法2我们可以这样想,只需要确定每个数字的开头位置即可。 首先,0的开头位置一定是0,那么,我们只需要确定1和2的开头位置即可。于是,我们设置两个指针ind1和ind2,分别代表1的开原创 2017-01-19 23:17:49 · 232 阅读 · 0 评论 -
Leetcode350 - Intersection of Two Arrays II(two pointers)
题意给定两个数组,求它们的交(不去重)思路算法1利用unordered_map的,将size较大的那一个数组存到map(has)里面,has[x] = tot,代表在第一个数组内x有多少个,然后对较小的那个数组内的每个元素进行遍历并在has内查找,每次找到hax[x]–。 时间复杂度:设较小的数组大小为m,较大的数组大小为n,好像unordered_map的插入时间为O(1)O(1),那么总的时间原创 2017-01-19 23:06:53 · 227 阅读 · 0 评论 -
Leetcode349 - Intersection of Two Arrays(two pointers)
题意求两个数组的交集思路用两个unordered_set将讲个数组存进去,然后遍历第二个set内的每一个元素,去查看第一个set里面有没有,在存入set的过程中已经去重。先排序,用两个指针i和j分别指向两个数组的开头,并且: s1[i]<s2[j]s1[i] < s2[j]:i++s1[i]>s2[j]s1[i] > s2[j]:j++s1[i]==s2[j]s1[i] == s2[j]:原创 2017-01-19 23:02:42 · 187 阅读 · 0 评论 -
Leetcode167 - Two Sum II - Input array is sorted(two pointers)
题意给定一个已经升序排序的数组和一个target,要求在数字中找到两个数的下标使其和为target,保证结果唯一。思路注意已经升序排好序了, 于是我们可以利用排序的性质。还是设置两个指针i和j分别指向头尾并且向中间扫描。分为如下三种情况:a[i]+a[j]==targeta[i] + a[j] == target:直接返回i和j即可。a[i]+a[j]<targeta[i] + a[j] < t原创 2017-01-19 22:59:13 · 245 阅读 · 0 评论 -
Leetcode 76 - Minimum Window Substring(Two Pointers)
题意给两个字符串s和t,要求找到s中最小的一段,使:t中的全部字母在s的这一段中出现。要求时间复杂度O(n)O(n)。思路双指针。我们设置两个指针i和j指向s中满足条件的那一段的头和尾。如果当前段满足条件,更新结果并且将i挪到下一个t中出现的字母的位置。如果不满足条件的话,将j后挪一个。我们可以来看看这个模拟过程:在判断是否满足条件时,有两种方法:开一个vis[]和need[]数组,其中need记原创 2017-04-03 12:08:16 · 245 阅读 · 0 评论