leetcode
码海岛主
这个作者很懒,什么都没留下…
展开
-
leetcode:最长不重复子串
记录一下这道折腾了两天的题目:https://leetcode.com/problems/longest-substring-without-repeating-characters/题意很简单,给一个字符串,求出它最长的无相同字符的子串。首先试了试暴力搜索,遍历一次字符串,遍历过程中,对每个字符都有一个O(n^2)的处理时间,因为需要遍历该字符之后的字符串,对每个字符,需要和已有的子串原创 2017-09-05 12:33:50 · 849 阅读 · 0 评论 -
leetcode:Shuffle an Array + Miss…
Shuffle an Array:主要内容就是随机shuffle一个数组,不能用额外空间。思路就是每次随机swap两个元素。但要确保数字的各种排列等可能出现,所以选取元素有讲究:swap(output[i],output[i+rand()%(output.size()-i)]),这样每次都是把当前元素与该元素之后的元素随机置换,比如有abcd那么d要出现在b的位置,可能性为:3/4(第一轮原创 2017-09-05 12:35:30 · 182 阅读 · 0 评论 -
leetcode:Integer to Roman + Fin…
Integer to Roman:这个思路还是挺简单,只要理清罗马文的书写规则即可,原理就是用递归,不断的减小数字,转为罗马文。如:if(num>=50) return "L"+intToRoman(num-50);Find Right Interval:给出一组线段的起点和终点,要求逐个找出这些线段右边第一个线段的id。中心思路就是找到第一个start大于目标线段end的线段。自己原创 2017-09-05 12:35:33 · 157 阅读 · 0 评论 -
leetcode:Bulb Switcher + K…
Bulb Switcher:给n个灯泡,第i轮关掉每i个灯泡,问n轮之后还剩几个灯泡。如果用数组模拟肯定要超时,仔细想了想DP也是要超时的。其实这道题就是道数学题,如果第i盏灯亮着,那么必定是个某个k的平方,因为只有这样它才会在第k轮被点亮,又没有对应的i的因子(i/k)来把它灭掉。Kth Smallest Element in a BST:搜索二叉排序树中第k小的元素。这道题证明了,原创 2017-09-05 12:35:44 · 175 阅读 · 0 评论 -
leetcode:Reconstruct Original D…
Reconstruct Original Digits from English:给定一组乱序的字符串,是由zero、one、two......到nine的所有字母乱序组成,求对应的升序数字串。如给定,owoztneoer,对应012。这道题是我自己想复杂了,想着找到每个数字的uniquenumber,然后贪心搜索。其实先把几个有独一无二字符的数字找出来(如:six的x即是独一无二),然后原创 2017-09-05 12:35:46 · 180 阅读 · 0 评论 -
leetcode:LongestRepeatingCharac…
Longest Repeating Character Replacement:给一个字符串,只能替换其中k个字符,求能替换出的最长相同字符的子串。这个是用滑动窗口来解,算是遇到的第一个这种类型的题目。i作为右窗口,不断右移直到s.size()-1。子串减去已出现的最多的字符数,如果超过k,说明此时需要替换的字符数量已经超过了k,要把左窗口右移。右移之后还要减少相应的字符数量Maximu原创 2017-09-05 12:35:52 · 173 阅读 · 0 评论 -
leetcode: Best Time&nb…
Best Time to Buy and Sell Stock with Cooldown:这道题从中学到最重要的就是,当发现一个DP怎么也无法表示完全时,考虑多个DP方程本题一共需要用三个DPbuy[i] = max(rest[i-1]-price,buy[i-1]) sell[i] = max(buy[i-1]+price,sell[i-1]) rest[i] = max(sel原创 2017-09-05 12:35:58 · 256 阅读 · 0 评论 -
leetcode:Gray Code +&n…
Gray Code:这道题说白了就是求1-n对应的格雷码,只要知道gray[i]=i^(i>>1)这个基本公式即可。Lexicographical Numbers:给出小于n的所有数字的字典序数组,如[1,10,11,12,13,2,3,4,5,6,7,8,9](n=13)。这道题我用的是深搜,不过看discuss,更快的是用迭代,直接循环n次,每次把数字按指定规律变化即可Binar原创 2017-09-05 12:36:00 · 172 阅读 · 0 评论 -
leetcode:Maximum Subarray+Find M…
Maximum Subarray:又遇到了经典问题,最大子段和。这里记录一下,其实这个问题难点就在于,不能用一个状态方程表示,而需要两个:end作为以第i个元素结尾,能取得的最大值,dp作为,前i个元素能取得的最大值end[i]=max(end[i-1]+nums[i],nums[i]);dp[i]=max(end[i],dp[i-1]);然后可以优化成两个变量,使空间复杂度降为O(1原创 2017-09-05 12:36:03 · 217 阅读 · 0 评论 -
leetcode:Longest Increasing…
Longest Increasing Subsequence:经典题目,最长上升子序列。这个比较容易想到DP正常思路是:dp[i]表示以i结尾的最长子序列长度,所以dp[i]=max(dp[i],dp[j]+1),其中j对应的num[j]转移方程混乱。所以以后还是不要贪多,转移方程最重要的是表示子问题的状态,重要的是精准而不是广泛First Missing Positive:找到无序原创 2017-09-05 12:36:06 · 150 阅读 · 0 评论 -
leetcode:Multiply Strings +…
eMultiply Strings:依然是模拟题,求两个字符串表示的大数乘积。其实只要模拟乘法的过程即可:数一第i位和数二第j位的乘积,是累加到答案的第i+j位。感觉模拟题还是要多点耐心,想清楚问题的关键即可。Jump Game:一开始想到用DP,从尾部开始往前,dp[i]=true的条件是它能到之后的任一true的位置。时间复杂度o(n),大数据测试时超时。换了用贪心,从后往前,每次原创 2017-09-05 12:36:08 · 205 阅读 · 0 评论 -
leetcode:Permutations1+2 + Rotat…
Permutations1:给定数组如[1,2,3],找出所有排列。用回溯法即可,关键在于迭代器的应用,我们可以用迭代器暂时把入栈的元素从数组中删除,这样就能很方便的用深搜来遍历数组了。Permutations2:数组中这次有了重复元素,解决方法很简单,在入栈之前做个判断,如果等于上一个元素,说明不用考虑(这种情况已经遍历过了)。关键是验证了一种方法,迭代器可以加减常量:ite==*(原创 2017-09-05 12:36:11 · 257 阅读 · 0 评论 -
leetcode:Pow(x, n) + N-Quee…
Pow(x, n):就是实现指数函数。其实自己已经想到边了,类似于pow(n/2)*pow(n/2),但一直在纠结这样其实也要算两次。其实只要换个角度,pow(x,n)=pow(x*x,n/2)即可。另外,要注意java和c++的差别,-2147483648(int型最大负数)这个数转为正数,在c++会溢出,java可能因为有自动处理机制,所以会正常转换。人生第一次抄答案(java版)还W原创 2017-09-05 12:36:17 · 240 阅读 · 0 评论 -
leetcode:Linked List Random Node…
Linked List Random Node:给定一个链表数组,随机返回其中一个元素,要求返回所有元素的可能性一致。满足这个要求很简单,求出链表的长度,然后根据长度设置随机值,再返回对应位置的元素即可。然后就是进阶要求:无法得到链表的长度,依然要求等概率随机返回。这个就涉及一个经典的算法,水塘抽样,步骤如下:1、把第一个样本放入ans2、对于接下来每个样本a[j],从1-j随机抽一个原创 2017-09-05 12:35:28 · 154 阅读 · 0 评论 -
leetcode:Single Number123 …
Single Number 1+2+3:这是一系列题目,第一题是,给定一个整数数组,数组中每个数都出现了两次,除了一个数仅出现一次,要求找到这个数。方法很简单,位操作,一路 异或 过去,两次的数都被抵消了,剩下的就是那个数第二题是每个数都出现了三次,找出那个出现了一次的数,就用一个32元素的数组,记录每个数的各二进制位是否为1,然后遍历这个32元素的数组,如果某元素的数值不能整除3,代表那原创 2017-09-05 12:35:25 · 218 阅读 · 0 评论 -
leetcode:最长回文子串
具体介绍略过,这道题暂时只想到暴力的思路,即从头遍历到尾,对于每个字符,寻找以它为中心的最长串,以及以它左边和它为中心的最长串即可,这里讲讲编程的时候遇到的几个地方。第一个就是,最开始一直输出错误答案,开始以为是判定边界有问题,把s.length()改成s.size(),发现并没有变化,后来上网查了一下,根据c++标准库,length和size函数没有差别,是因为先有的length,后来引入原创 2017-09-05 12:33:53 · 228 阅读 · 0 评论 -
(leetcode)数位反转
今天做的数位反转还比较简单,唯一需要注意的是,得考虑溢出问题。比如123反转321,这没问题,但要是10000009,这个数本身没超过int的范围,但反转之后就超出了。说来惭愧,这个问题还是等WA了一次之后,看提示才知道的,果然很久没有严谨地思考问题了。解决也很简单,首先用一个longlong的数存下转换的结果,用numeric_limits::max()和numeric_limits::m原创 2017-09-05 12:33:58 · 341 阅读 · 0 评论 -
leetcode:atoi(含去除首空格与字…
今天刷的是8. String to Integer(atoi)这道题,看了题目的spoiler之后一次AC,需要注意的点都顾及到就行了,这里主要说两个问题。第一个是如何去掉字符串的首空格,这个需要erase函数搭配find_first_not_of(),具体使用方法为:str.erase(0,str.find_first_not_of(" "))str.find_first_not_o原创 2017-09-05 12:34:01 · 393 阅读 · 0 评论 -
leetcode:最大容器问题
原题描述如下:Given n non-negative integers a1, a2, ...,an, where eachrepresents a point at coordinate (i, ai). n vertical lines aredrawn such that the two endpoints of linei is at (i, ai) and (i,0). Fin原创 2017-09-05 12:34:04 · 308 阅读 · 0 评论 -
leetcode:字符排列组合
题目简单来说是:给一串数字,对应手机键盘输入法的九宫格,比如2代表abc三个字母,3代表def等等。然后列出这串数字能组合出的字符串。思路很简单,就是简单的枚举,这里讲一下几个注意的点:1、首先如果使用的操作是ans.push_back(tempans[i]+str[j])这样,那么有个问题,最初的ans是没有成员的,所以会导致tempans也为空,那么循环的判定条件i2、另外一个原创 2017-09-05 12:34:17 · 779 阅读 · 0 评论 -
leetcode:4sum以及快慢指针
一、4sum这题就是2sum和3sum的升级版,要求在一串数组中找到加起来等于target值的所有组合,所以答案不止一组。时间复杂度上O(n^3)是可以解决的,不过要注意去除重复的,比如有一串2,那么指针指到第一个2再处理一遍就行,处理完马上移到最后一个2的下一位,这是因为,比如一个合法解是(2,a,b,c),那么如果从第一个2开始找到的解,就一定会包括指向接下来的2时,能找到的所有解。原创 2017-09-05 12:34:20 · 192 阅读 · 0 评论 -
leetcode:括号匹配问题
题意很简单,就是给定一系列的(){}[]括号的字符串,让程序检测出括号是否一一对应,比如({)}这样的就是不合格的。思路还是很简单,就用栈来解决,后进先出,看新的}])元素,是否和栈顶的({[元素匹配。记录一下自己失误的地方,一个是设定栈的元素类型时,忘了可以直接用string::value_type来取得字符串的元素类型,当然,根据文档显示,value_type即是char类型。原创 2017-09-05 12:34:50 · 394 阅读 · 0 评论 -
leetcode:Generate Parentheses
题意是:现有n对括号,问这些括号共能组成多少合法的字符串比如n=3,对应的字符串数组就是:[ "((()))", "(()())", "(())()", "()(())", "()()()"]这道题自己想到的思路是:每次在当前串中插入一个左/右括号,并且始终保证左括号数量不大于右括号(不然就会出现有右括号无法匹配到左括号的情况)。递归终结条件是判定左括号数量为原创 2017-09-05 12:34:53 · 116 阅读 · 0 评论 -
leetcode:Remove Element + Imple…
Remove Element:题意主要是给定一个字符串及一个值val,在不使用额外空间的条件下,把所有等于val的值去掉(放在数组最末位),返回更新后的数组长度。我的思路很简单,遍历一次数组,每当遇到等于val的数值时,就以此的下一个为起点往后遍历,找到第一个不等于val的值,交换即可。看了大神的思路,才意识到,直接寻找不相等的值来替换之前寻到的val,速度会快很多,程序也很简洁:原创 2017-09-05 12:35:09 · 166 阅读 · 0 评论 -
leetcode:Divide Two Integers + …
Divide Two Integers:这道题难度不是很大,主要是细节问题,大意是求两个数相除,不能用乘除法和取模。思路就是被除数不断减去除数,直到被除数小于除数为止。加快效率的办法是位运算,除数不断左移(相当于不断乘2),找到刚好小于被除数的那个数,与被除数相减。此时答案ans+=(1几个需要注意的点:1、记得判断正负,我这里处理的办法是全部转为正数2、负数最大值(-21474836原创 2017-09-05 12:35:17 · 156 阅读 · 0 评论 -
leetcode:Next Permutation + Lon…
Next Permutation:题意是,给定一个字符串,如4123,求出在字典序排列组合下大于它的下一个字符串,上例的答案是4132,4312虽然也大于,但在排列组合中不是紧邻4123的,因此不行。思路是升序降序从后往前找,如果一直是升序,说明这个字符串就是字典序下最大的了,没有更大的,按照题目要求,就返回字符序最小的,如输入4321(最大字典序),那么返回1234。如果遍历过程原创 2017-09-05 12:35:20 · 163 阅读 · 0 评论 -
leetcode:Fraction to Recurring …
Fraction to Recurring Decimal:题目大意就是给定一个除数被除数,用字符串表示结果,小数循环部分用括号括起来,比如1/3=0.(3)一开始想到用map储存状态,自然想到直接记录小数的数字,但不太方便。换个角度,我们来存储“状态”,也就是被除数(除数永远是恒定的),然后遇到重复的被除数,则说明开始循环。思路是对的,连续wa的几次,总结原因还是没有一个清晰的流程图,原创 2017-09-05 12:35:22 · 201 阅读 · 0 评论 -
leetcode:Simplify Path+Edit…
Simplify Path:题目本身不难,模拟linux的文件路径,如../表示上一级目录,用栈的思想即可。不过我的方法用了一堆if,最关键的是,我是逐个读取字符,看了大神的代码,直接getline(ss,tmp,'/'),tmp就是两个/之间的字符串。Edit Distance:用替换、删除、插入三种方法,把字符串s1转为s2。典型的动态规划,关键还是要想到状态转移方程:dp[i][原创 2017-09-05 12:36:23 · 210 阅读 · 0 评论