
线性表、数组
文章平均质量分 63
binling
这个作者很懒,什么都没留下…
展开
-
3Sum
先排序,然后穷举第一个数,原创 2014-07-28 20:07:16 · 454 阅读 · 0 评论 -
quick select 问题
思路一1)partition,轴为i,i是相对于传进来的数组的2) 如果 i == k - 1, A[i]就是所求;如果i > k - 1, 说明第k在前半部分,并且仍然是前半部分的第k;如果 i int findK(int A[], int n, int k) { if (!A || n n) throw invalid_argument("invalid argume原创 2015-01-04 16:44:22 · 794 阅读 · 0 评论 -
Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the array.Each element in the array represents your maximum jump length at that position. Determine if you a原创 2014-11-25 09:39:23 · 385 阅读 · 0 评论 -
2Sum closest vs. 2Minus closest
一 如果去掉closest,,即2sum 和2minus问题1 这两个题都可以转化成查找问题,枚举其中一个数a,查找另一个,对于2sum 就是查找sum-a,对于2minus就是查找a-diff和diff-a,用hashmap实现O(n)。2 也可以先排序再用双指针法,注意2sum的双指针是两头夹逼,2minus的双指针是同向移动(即滑动窗口法)二 如果是closest 问题原创 2014-12-10 17:59:16 · 872 阅读 · 0 评论 -
Next Permutation
算法摘要1)从右往左扫描,原创 2014-07-30 12:08:23 · 481 阅读 · 0 评论 -
名人问题
名人的定义:他不认识任何人,任何人都认识他 (最多有一个名人)和众数问题的框架很像,都是维护一个candidate,然后扫一遍,不断排除,最后的唯一的可能性就是candidate,验证这个candidate1)取第一个做为candidate2) 遍历剩余的人,如果 candidate knows i, 排除当前candidate,换成i;否则排除i, candidate不变...原创 2015-08-04 18:59:59 · 1248 阅读 · 0 评论 -
lower_bound, upper_bound的写法——两种收敛逼近
一种写法是保证解在区间内,while条件是l 还有一种写法是解肯能被排除在区间外,两侧都不包含mid:l = mid + 1, r = mid - 1,while条件是 l r 解是l, 如果解在左侧,最后一次判断之后 l > r, 解是r。靠垫是最后区间溢出后的位置,所以while 条件必须是 l原创 2015-07-06 20:53:19 · 889 阅读 · 0 评论 -
Jump Game II
Given an array of non-negative integers, you are initially positioned at the first index of the array.Each element in the array represents your maximum jump length at that position.Your goal is to rea原创 2014-11-25 10:33:10 · 420 阅读 · 0 评论 -
打表法经典2题:小于n的质数和第k个丑数
1 求小于n的所有质数1 开一个大小为n的bool数组A,下标代表整数,值true代表被mark过,有因子,非素数2) i 从 2开始到n - 1,如果A[i]没被mark,A[i]就是质数,然后mark有A[i]因子的数(2* A[i], 3*A[i], 4*A[i] 且public int countPrimes(int n) { boolean[] marked = ne原创 2015-07-07 23:57:33 · 968 阅读 · 0 评论 -
滑动窗口法模板
滑动窗口法用于求满足某种条件的最短或最长子数组(子串)如:1)最小摘要2)sum大于target的最短子数组3)最长的无重复字符的子串4)最长的最多有k个不同字符的子串最短子串模板:1)外层循环遍历终点j ,2)内循环:如果当前窗口满足条件,和最最优比并保存,然后起点 i++for (int j = 0; j < s.size(); j++) { 窗口右端扩展,加原创 2015-05-15 17:44:02 · 6658 阅读 · 1 评论 -
双指针、单调性的思考
单调性的好处就是使得不需要一一扫描判断一个一个排除,而是有可能集体判断排除一大片。二分法就是一个应用:当A[mid] 其实经典的排序数组2sum 问题和杨氏矩阵查找也是利用单调性进行集体判断、排除的一个应用:1)l, r已经分别处在最大和最小的极限,当A[l] + A[r] 杨氏矩阵也是,每一一次移动之后又都是一个杨氏矩阵查找问题,2正数数组的子数组和等于targe原创 2015-09-16 17:37:45 · 761 阅读 · 0 评论 -
数组双指针法汇总
指针移动方向:相向夹逼,同向移动维护的是一个区间还是只是关心指针指向的两个元素同向移动的、维护一个区间的双指针法即滑动窗口法,2Sum两头往中间夹逼的双指针法。指针为什么可以不回退?即为什么可以i只++, j只--?当A[i]+A[j]2MinusCloset: 寻找两个数,其差值最接近給定值target排序后,同向移动的双指针法。当A[j]-A[i]>ta原创 2014-12-14 17:12:27 · 1583 阅读 · 0 评论 -
两个有序数组,从中各取一个组成pair,求和最小的前K个pair(杨氏矩阵top k问题)
不需要把所有的数放进优先队列,每次只放当前数的下边和右边的数,其他更远的数,肯定比这两个数更大,vector> topKPair(vector &A, vector &B, int k) { vector> ans; if (A.empty() || B.empty()) return ans; priority_queue>, vector>>, greater>>> pq;原创 2015-07-06 15:17:45 · 2002 阅读 · 0 评论 -
倍增搜索
二分搜索适合既有下界也有上界,对于只知道一边的界情况,可以用倍增搜索法int search(vector A, int x) { for (int i = 0; A[i] <= x;) { if (A[i] == x) return i; if (i + 1 == A.size() || A[i + 1] > x) return -1;原创 2015-06-29 12:49:14 · 640 阅读 · 0 评论 -
Trapping Rain Water
题目:一个数组,每个元素代表原创 2014-07-31 09:08:07 · 497 阅读 · 0 评论 -
merge sort 一些变种、应用
1 逆序对数目:int countInvertion(vector &A, int l, int r, vector &B) { if (l >= r) return 0; int m = (l + r) / 2; int a = countInvertion(A, l, m, B); int b = countInvertion(A, m + 1, r, B); int原创 2015-05-29 19:32:16 · 662 阅读 · 0 评论 -
Container With Most Water
一个竖着的线段列表,求任意两个线段原创 2014-08-23 17:25:40 · 399 阅读 · 0 评论 -
Plus One
数组代表一个数,每个元素代表一位,就原创 2014-07-31 15:18:45 · 408 阅读 · 0 评论 -
寻找数组中丢失的、者重复的、或者出现一次的的数的问题汇总
1. 集合增量问题一组大小为1到n的牌,抽走一张,求抽走的是哪张牌?此类问题特点:输入:1)已知原始集合:或者是直接给定一个数组,或者是给一个描述,比如1到n,每个数出现一次(或2次),总之原始集合是确定的2)改变后的集合:原始集合拿走(添加)一个或2个数之后的集合求:少了的数,多出来的数等,其实就是求两个集合的增量思路:题目所求就是求2个集合之间的增量(差异),所以...原创 2014-12-22 18:18:17 · 1001 阅读 · 0 评论 -
Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3原创 2014-12-09 22:41:58 · 386 阅读 · 0 评论 -
几个子数组问题的相互转换
两个条件:1)元素是任意数还是都是正数2)数组A是否有序1 一般问题:元素可正可负,无序求前缀和数组B,问题转化为,数组B求差等于target的两个数的方案个数,即2Minus问题。2Minus问题可以排序后直接同向移动双指针法求解,也可以进一步转换求差分数组C,因为是排好序求的差分数组,C数组的元素都是正数,但是相邻元素的差不同,C不是有序的。B中两个元素的差,相当于是累加两原创 2015-06-03 13:10:42 · 452 阅读 · 0 评论 -
Search in rotated sorted Array
1)首先确定mid落在前半部分还是后半部分,用A[mi原创 2014-07-25 09:07:48 · 488 阅读 · 0 评论 -
4sum
1)排序2)穷举前两个数的组合,保证原创 2014-07-29 11:49:12 · 633 阅读 · 0 评论 -
Remove Duplicates from Sorted Array II
还是原地重写法。条件是A[原创 2014-07-30 01:04:14 · 350 阅读 · 0 评论 -
Remove Duplicates from Sorted Array
排序数组的duplicates都是相邻的,原地重写fa原创 2014-07-30 00:29:56 · 383 阅读 · 0 评论 -
Remove Element
从数组中删除满足某种条件的元素,原创 2014-07-30 09:14:08 · 371 阅读 · 0 评论 -
原地重写法
原地重写法有2种常见应用:1)原创 2014-08-12 09:59:10 · 484 阅读 · 0 评论 -
partition算法的3种形态
1)原地重写法:条件是小于轴,不符合交换原创 2014-08-12 09:47:49 · 869 阅读 · 1 评论 -
关于各种merge 的心得
合并两个线性表, 包括合并两个有序原创 2014-09-10 12:25:15 · 671 阅读 · 0 评论 -
Median of Two Sorted Arrays
O(logn)算法:原创 2014-07-29 19:41:00 · 517 阅读 · 0 评论 -
Palindrome Partitioning II
Calculate and maintain 2 DP states:pal[i][j] , which is whether s[i..j] forms a pald[i], which is the minCut for s[i..n-1]Once we comes to a pal[i][j]==true:if j==n-1, the string s原创 2014-10-16 16:32:45 · 370 阅读 · 0 评论 -
求满足某种条件的子串问题- 滑动窗口法
维护一个invariant,窗口对应的子串始终满足给定条件滑动的方式是:右边滑动,直到破坏这个invariant。原创 2014-12-02 20:17:45 · 524 阅读 · 0 评论 -
数组值和下标是同一值域的题目汇总
一、重复的数大小为n+1的数组,元素取值为[1,n],有一个数重复出现,找出这个数原创 2014-12-22 14:37:15 · 464 阅读 · 0 评论 -
re-arrange 数组问题汇总
一 re-arrange 数组1排序2 shuffle3 partition(2 way, 3 way, n way)4 interleave3 错排原创 2014-12-21 20:39:24 · 736 阅读 · 0 评论 -
二分查找题目汇总
1)Search In Rotated Array2) Search In Rotated Array ||3)原创 2014-08-28 12:25:49 · 1168 阅读 · 0 评论 -
子串/子段问题总结
1. 一般子串问题:求一个串中满足某种条件的子串1)如果所求子串的条件是一个值,比如sum,则考虑子段问题,注意这样一个性质,子段= 前缀差,子段和=前缀和的差,2)如果满足满足滑动窗口的条件,滑动窗口法。3)回文子串等不满足1),2)的,dp的方向考虑4)暴力,但注意不是枚举所有子串(O(n^2))而是枚举终点。2. 两个串中子串问题,或者一个串中多个子串问题LC原创 2014-12-03 09:23:03 · 553 阅读 · 0 评论 -
最大子数组和系列
1 给定一个矩阵,求最大子矩阵和思路:尝试直接二维dp,发现f[i][j] 和 f[i - 1][j], f[i][j- 1], f[i- 1][j - 1]没有明显的递推关系。solution: 枚举子矩阵的上下界,列聚合,转化成一维最大子数组问题。先对原矩阵按列求前缀和,第i行与第j行之间第k列上的和就是A[j][k] - A[i - 1][k]。def maxMatrixSum(原创 2015-05-30 09:16:28 · 797 阅读 · 0 评论 -
Permutation Sequence
string getPermutation(int n, int k)类似康拓展开的思路。原创 2014-07-30 15:44:03 · 435 阅读 · 0 评论