08 2016 档案

摘要:输入一个序列,求第一个a[i]>a[i-1]&&a[i]>a[i+1]的元素 遍历一遍 阅读全文
posted @ 2016-08-31 19:40 0_summer 阅读(144) 评论(0) 推荐(0)
摘要:输入一个递增序列,求两个元素的和等于target的下标 数组求和系列问题,用头尾指针法,ON 阅读全文
posted @ 2016-08-31 19:29 0_summer 阅读(109) 评论(0) 推荐(0)
摘要:输入一个数组,求连续子数组中乘积最大的 这个和最大连续子数组很相似,但是由于相加和乘积的差异性所有有差别http://www.cnblogs.com/0summer/p/5822908.html 一个数(正数、零、负数)乘以一个负数会变得更小,所以负数对当前元素来说是负影响,但是这个负数可能对于后面 阅读全文
posted @ 2016-08-31 19:24 0_summer 阅读(131) 评论(0) 推荐(0)
摘要:输入一个字符串,逆序其中的单词 先遍历一遍字符串,把单词放入vector<string> vs中,然后逆序vs,之后遍历一遍vs放入s中 注意可能有连续很多个空格 阅读全文
posted @ 2016-08-31 18:57 0_summer 阅读(118) 评论(0) 推荐(0)
摘要:和上题一样,本题的序列中可能有重复的元素,不过用上题的代码能过 阅读全文
posted @ 2016-08-31 18:36 0_summer 阅读(102) 评论(0) 推荐(0)
摘要:一个递增数组,没有重复的元素,可能被右移过,找出最小的元素 这和这题差不多http://www.cnblogs.com/0summer/p/5825282.html 依旧是改进过的二分: 1.如果nums[l]<nums[mid],说明[l,mid]是递增的,但是[mid,r]不确定 1)如果num 阅读全文
posted @ 2016-08-31 18:33 0_summer 阅读(141) 评论(0) 推荐(0)
摘要:输入两个数组,gas[i]表示在i位置能加的油,cost[i]表示在i位置到i+1位置消耗的油,这n个位置围成一个圈,求是否存在从某一点出发能走完全程 第一想法是贪心,先处理处gas[i]/cost[i],然后从这个比值最大的点开始走,但找到反例:(5,4),(6,4),(5,5),(4,7),按刚 阅读全文
posted @ 2016-08-31 14:05 0_summer 阅读(136) 评论(0) 推荐(0)
摘要:输入一组序列,求所有的子集,和这一题一样http://www.cnblogs.com/0summer/p/5824212.html 这是本题输入的序列中可能有重复的元素,没有关系,上一题我已经考虑过这个问题了,就是树的每一层相同的元素只搜索一次,看注释 选择:dfs+回溯 去重:树的每一层相同的元素 阅读全文
posted @ 2016-08-31 11:56 0_summer 阅读(181) 评论(0) 推荐(0)
摘要:这题和http://www.cnblogs.com/0summer/p/5825282.html一样,只是上一题中序列里没有重复的元素 代码都是一样的 阅读全文
posted @ 2016-08-31 11:44 0_summer 阅读(172) 评论(0) 推荐(0)
摘要:一个有序的序列,可能右移了一定长度,求target在这个右移后的序列中的位置 直观做法:遍历一遍,但这题肯定原意不是这个 正解:二分,因为这个序列其实局部还是有序的 1.如果nums[l]<nums[mid]说明[l,mid]区间是有序的: 1)如果target>=nums[l]且target<=n 阅读全文
posted @ 2016-08-31 11:40 0_summer 阅读(124) 评论(0) 推荐(0)
摘要:输入非递减数组,要求每个元素最多重复两次,求最后剩下的数组和元素个数 这题函数的返回值是元素个数,但是还需要把输入的参数也就是输入的数组也改动成合法的 因为是有序的序列,所以直接遍历一遍,用cur保存元素,cnt保存这个元素出现的次数就好,ON 阅读全文
posted @ 2016-08-31 11:07 0_summer 阅读(134) 评论(0) 推荐(0)
摘要:输入n,求n个bit的格雷码,格雷码是从0开始,每个数之间只有一个bit不一样,如00,01,11,10 这题先审错了题,以为求n个bit的数有多少种,相当于选择,用dfs+回溯,没有注意到格雷码的要求。 找规律:根据要求发现可以这么做: 每轮以2^k为一组来求,假设上一轮的2^(k-1)是合法的格 阅读全文
posted @ 2016-08-31 10:42 0_summer 阅读(140) 评论(0) 推荐(0)
摘要:输入一个数组,求所有子集 也是选择问题,在上一题的基础上枚举子集长度,然后dfs+回溯选择。同样注意去重 阅读全文
posted @ 2016-08-31 00:03 0_summer 阅读(191) 评论(0) 推荐(0)
摘要:输入n和k,求1~n中任选k个数的所有组合 这题是选择不是排列,所以用dfs+回溯 还是那个问题——去重:想象一颗树,每一层相同的元素只搜索一次,下次若同一层这个元素已经做过了就跳过,具体看代码 阅读全文
posted @ 2016-08-30 23:56 0_summer 阅读(146) 评论(0) 推荐(0)
摘要:输入一个矩阵,求从左上角走到右下角经过的格子的最小和 第一次用得dfs,超时 正解:dp 和上两题差不多 阅读全文
posted @ 2016-08-30 23:30 0_summer 阅读(120) 评论(0) 推荐(0)
摘要:输入一个矩阵,0代表能走,1代表不能走,求从左上角走到右下角有多少种走法,和上题差不多,主思路还是从右下角开始填数字,然后a[i][j]=a[i+1][j]+a[i][j+1], 不过多了对能不能走的判断,这里我先把不能走的处理成INT_MAX,如果一个格子的下和右都能走,那么下+右,否则min(下 阅读全文
posted @ 2016-08-30 21:23 0_summer 阅读(170) 评论(0) 推荐(0)
摘要:输入m,n代表一个m*n的矩阵,求从左上角走到右下角,每次只能往右或者往下走,能有多少种走法 找规律,发现就是从右下角开始填数字,每个格子的值是a[i][j]=a[i+1][j]+a[i][j+1],最后输出a[0][0],具体的画图理解 阅读全文
posted @ 2016-08-30 21:07 0_summer 阅读(137) 评论(0) 推荐(0)
摘要:输入n,k,求1~n的数的全排列中第k大的排列,其中n<10 暴力做法是先求全排列(递归+交换),然后返回第k大的,但明显题目意图应该不是这样 找规律: 第一轮:假设a[0]=1,后面有 (n-1)!个全排列 第二轮:假设a[0]=2,后面有(n-1)!个全排列 ...... 因此,d*(n-1)! 阅读全文
posted @ 2016-08-30 20:54 0_summer 阅读(93) 评论(0) 推荐(0)
摘要:输入一个数组,a[i]表示第i个位置最远能跳的步数,求能否从0跳到n-1 一开始想的深搜,然后发现有贪心的做法,step保存能跳的最远的步数,遍历数组,step--,然后更新step为当前能跳的最远的步数,如果这个步数==0说明跳不了了,false; 如果step+i>=nums.size()-1说 阅读全文
posted @ 2016-08-30 18:12 0_summer 阅读(172) 评论(0) 推荐(0)
摘要:最大子串和,输入一个数组,求连续的元素和的最大值 ans保存最大值,sum保存包含当前元素的前一个元素的连续子串的和,如果sum<0说明对当前元素来说是负影响,所以sum=0,然后加到当前元素;如果sum>=0说明是正影响,加到当前元素。更新答案。ON 阅读全文
posted @ 2016-08-30 17:35 0_summer 阅读(110) 评论(0) 推荐(0)
摘要:输入一组字符串,将有相同字符的字符串分到一组,输出分好的组 这里我用一个map<string,vector<string> >来保存一个字符串中出现的字符以及对应的分组,之后拷贝到vector<vector<string> >中返回即可 阅读全文
posted @ 2016-08-30 17:29 0_summer 阅读(205) 评论(0) 推荐(0)
摘要:输入一个数组,字典序输出所有排列,输入的数组中元素可能有重复。 详细思路看上一篇博文,这里重点说一下去重: 上一篇的去重不完善,思路是完善的,代码不完善,加了一个判断才对,具体看代码注释 阅读全文
posted @ 2016-08-30 15:50 0_summer 阅读(122) 评论(0) 推荐(0)
摘要:输入一个数组,字典序输出所有组合。 这和输入一个数组,求元素和等于target的所有组合不同,这题是求全排列,每个元素都要选到,而元素和是选择任意的元素,有些元素可能不选 选择用:dfs+回溯(思路是深搜每个元素,选择,直到树的底部,如果满足条件放入结果,返回,回溯) 排列用:递归+交换(思路是对n 阅读全文
posted @ 2016-08-30 15:22 0_summer 阅读(611) 评论(0) 推荐(0)
摘要:输入一个数组,选择任意个数的元素,求和等于target的所有组合,每个元素只能选择一次,组合不能重复 求组合:先排序,dfs,回溯 去重:把dfs想象成一颗树,同一层如果元素值相同,那么只对第一个元素深搜,其余相同的元素不必深搜,注意是同一层,看代码注释 阅读全文
posted @ 2016-08-30 12:49 0_summer 阅读(98) 评论(0) 推荐(0)
摘要:输入一个数组和target,选择任意个数的元素,求和为target的组合,每个元素可以选择多次 dfs,回溯,因为每个元素可以选择多次,所以向下搜索的时候从当前元素开始 同类题:http://blog.csdn.net/AC_0_summer/article/details/48293581 阅读全文
posted @ 2016-08-30 12:21 0_summer 阅读(109) 评论(0) 推荐(0)
摘要:输入递增序列和target,如果target存在返回它在序列中的位置,否则返回将它插入序列的位置 二分 阅读全文
posted @ 2016-08-30 11:16 0_summer 阅读(136) 评论(0) 推荐(0)
摘要:输入一个递增序列和一个target,找出序列中target的上界和下界 二分,实现lower_bound和upper_bound,要注意的是没有找到target的情况的判断:low==high,或者nums[high-1]!=target(high初始设为nums.size()) 阅读全文
posted @ 2016-08-30 11:11 0_summer 阅读(90) 评论(0) 推荐(0)
摘要:输入一个序列,求字典序更大的下一个序列 可以直接调用next_permutation(),一行搞定 非要写出实现细节的话,就是从后往前遍历,找到递减序列的前一个元素设为x,如果整个序列是递减的,直接reverse,否则将x与递减序列的第一个大于它的数交换,然后reverse递减序列。寻找递减序列中第 阅读全文
posted @ 2016-08-30 10:55 0_summer 阅读(149) 评论(0) 推荐(0)
摘要:输入n,输出n个括号的组合。 如果仅仅求组合有多少种,直接用卡特兰公式,但要求输出所有组合,用dfs,回溯,条件是: 设ll和rr为剩下的左括号和右括号数 1.ll>0,可输出左括号 2.ll>=rr,说明不合法,return 3.输出右括号 原因是先出现了左括号才能出现右括号 阅读全文
posted @ 2016-08-30 09:54 0_summer 阅读(103) 评论(0) 推荐(0)
摘要:输入数组,任选四个数字求和,输出所有和等于target的组合,组合不能重复。 还是先排序在用头尾指针,时间降到O^3。注意跳过相同的元素就能实现去重 阅读全文
posted @ 2016-08-30 09:25 0_summer 阅读(111) 评论(0) 推荐(0)
摘要:输入一个数组,任选三个数求和,和为0的所有组合,不能重复,即,-1,0,1这样的三元组只能出现一次。 解法:类似两个数求和的方法,先排序,然后首尾指针法,但这里要求三个数,所以还是得遍历一遍,因此第一个数遍历,剩下两个数用首尾指针法,ON^2 对于重复三元组的处理:本来想把所有结果先放入set<no 阅读全文
posted @ 2016-08-30 00:49 0_summer 阅读(139) 评论(0) 推荐(0)
摘要:输入一组数字,任选三个数字,求这三个数字加起来最接近某一值的和。 枚举三个数字的话ON^3 更高效的方法,利用了求一组数字中两个数字的和的方法,即用两个指针指向首尾往中间移动,前提是数组有序,所以先排序。遍历数组,然后用两个指针指向这个元素后面序列的首尾,如果这三个数字的和到target的距离比之前 阅读全文
posted @ 2016-08-29 23:53 0_summer 阅读(120) 评论(0) 推荐(0)
摘要:输入一组数字,根据手机九宫格上每个数字对应的字母,输出这组数字能代表的所有字母的组合。 dfs,回溯。 阅读全文
posted @ 2016-08-29 22:13 0_summer 阅读(130) 评论(0) 推荐(0)
摘要:输入一个数组,数组中的值代表在数轴的i位置有一个高位height[i]的板子,求两个板子间盛水的最大值。 用两个指针,指向头尾,计算面积,然后移动矮的那个指针,ON 阅读全文
posted @ 2016-08-29 21:36 0_summer 阅读(136) 评论(0) 推荐(0)