随笔分类 - LeetCode
LeetCode题解
摘要:因为字符串可以按照字典序比较大小,所以可以自己写一个排序规则cmp,然后对数组中的所有整数转换成字符串之后再按照自己定义的规则排序。 排序之后,再将所有字符串连接起来,就是它们能够组成的最大整数。 注意特殊情况的判断,如果数组全是0,我们不想要输出"00000...00000"这种情况,只要输出一个
阅读全文
摘要:这题题目描述的有点不清楚,题意是给一个字符串,如果有某个子串(长度为10)重复出现了,就记录到一个数组里,最后返回的数组就是重复出现的子串组成的数组。 因为子串长度固定为10,所以遍历一遍就行,每个子串都记录到一个set里,这个set就是判断子串是否重复出现了,如果重复出现了,就记录到数组里。 但是
阅读全文
摘要:要实现二叉搜索树的迭代器,判断当前元素是否有下一个元素和知道下一个元素是多少? 好办,二叉搜索树的中序遍历序列不是升序的嘛,那我们就可以对二叉搜索树中序遍历一遍记录到一个全局变量数组里面,然后要判断是否有下一个元素和下一个元素是多少就很简单了。 代码如下: /** * Definition for
阅读全文
摘要:参考这个链接 直接计算阶乘,再求0的个数肯定会溢出,因为阶乘增长的很快。 所以需要观察一下规律,阶乘里出现0,肯定是能被10整除,而10只能由2*5组成,所以问题就转换为阶乘里有几对2和5. 由于2每两个数就出现一次,5要每5个数出现一次,所以阶乘里2的数量肯定比5多,所以问题又转换为寻找阶乘里5的
阅读全文
摘要:把每一位的字母转换成1~26的数字,再乘上pow(26, x),x是当前字符的位置到字符串末尾的距离,比如最后一个字母,就乘上26的0次方,也就是1. 倒数第二个字母,就乘上26的1次方,依次类推。 class Solution { public: int titleToNumber(string
阅读全文
摘要:遍历一遍数组,对所有元素的出现次数做哈希。 class Solution { public: int majorityElement(vector<int>& nums) { unordered_map<int, int> hash; int size = nums.size(); for(int
阅读全文
摘要:逆序来求字符串,每次把当前数字n对26取余,也就是当前这一位的字母,加到字符串里。 然后数字n整除26,再继续判断是否还能添加字符。 class Solution { public: string convertToTitle(int n) { string res; while(n != 0) {
阅读全文
摘要:既然题目都说了数组是升序的,那就双指针分别指向数组开头末尾,然后判断两个指针指向的数是否和target相等,如果和小于target,那么左指针右移,这样就可以让和增加了,如果和大于target,那么让右指针左移,这样就可以让和减小了,一直这样操作直到和等于target或者左右指针相遇。 代码如下:
阅读全文
摘要:题目说了,峰值元素就是大于相邻左右元素的元素,又说了nums[-1] = nums[n] = -∞,所以我们就寻思着,如果nums[0]比nums[1]大,再加上nums[-1]是负无穷,那么nums[0]不就是一个峰值元素了吗。 如果nums[0]不比nums[1]大,那么我们接着把nums[1]
阅读全文
摘要:这题做法比较贼,让两个指针p, q分别指向两个链表的头,然后只要两个指针不为空且指向的位置不同,就都向后移动,当一个指针为空的时候,就指向另一个链表的头。 比如上面这图,假设相交部分之前,两个链表的长度分别是a,b,相交链表之后的长度为c。 那么p指针走了a + c长度(走完第一个链表)之后,指向第
阅读全文
摘要:要能够在常数时间内检索到栈内最小元素,我们可以额外开一个栈,这个额外的栈的栈顶元素存放目前栈内的最小元素,每次栈内压入一个新元素,辅助栈也压入一个元素,也就是把新元素和原栈顶元素比较,较小的那个就是新的最小元素,压入辅助栈的栈顶;原栈弹出栈顶元素的时候,辅助栈也弹出栈顶元素,这样,不管什么时候,辅助
阅读全文
摘要:经过旋转后的数组,满足这样一个性质,最小值右边的元素,都大于等于最小值(因为这题有重复元素,所以有可能等于),最小值左边的元素,都大于等于最小值。 所以每一次二分,我们可以与当前区间的最左边或最右边进行比较,确定最小值的位置。 这里我们每次将区间中点的值nums[mid]与区间右端点nums[rig
阅读全文
摘要:题目说了是对升序的数组做旋转得到的数组,可以考虑二分。 因为做过旋转了,所以不能直接用二分。 找一下规律,旋转数组原来是升序的,那么最小的元素就是旋转前的第一个元素。 旋转之后,相当于把原来升序数组的前面某些部分放到了数组的后面,那么这个数组就满足,在最小的元素之前的部分数组依旧是升序的,然后最小的
阅读全文
摘要:要求乘积最大的子数组(子数组一定都是连续的),可以暴力枚举子数组起点和终点,求和。但是肯定超时。 如果用动态规划,则只需要一遍扫描就可以得出结果。 可以用maxProduct[i]表示以i结尾的最大的子数组乘积。 如果所有nums[i]都是正数,则maxProduct[i]就是max(nums[i]
阅读全文
摘要:题意是要把原字符串中所有的单词划分出来,倒序用一个空格的间隙来连接字符串,我们只需要划分出所有的单词,然后把它们连接起来,每两个单词之间放一个空格就好了。 分割空格之间的单词,很容易想到用双指针进行分割,只需要找到每个单词的第一个字母(也就是第一个不为空格的字母),然后左指针指向这个单词,右指针不断
阅读全文
摘要:1523. 在区间范围内统计奇数数目 先计算从low到high一共有多少个数: int diff = high - low + 1; 找规律发现,如果low和high都是奇数,那么奇数个数就是diff上取整,其他情况奇数数目都是diff下取整。 class Solution { public: in
阅读全文
摘要:经典dp问题,用dp[i]表示前i个字符解码方案的总数。 显然dp[0]=1(空字符也相当于一种解码方案), 然后从小到大递推计算dp数组,如果当前当前数字不是0(也就是大于等于1小于等于9),则当前字符可以连接在之前所有字符之后成为一个新方案。 当前字符是0是不行的,0不能映射成英文字母。 所以有
阅读全文
摘要:DFS枚举所有子集,对于每个数字,假设出现次数是cnt,则枚举这个数字的出现次数0,1, 2,.....cnt,其他数字同理。 所以解空间是指数级的。 要计算所有数字出现的次数,可以直接排序,这样同样的数字都是相邻的。 然后一个for循环枚举每个数的添加次数,假设一个数字的出现次数是cnt,则枚举它
阅读全文
摘要:找规律,格雷码的一种生成方法如下图。对于n先将n-1的所有格雷码复制一下,然后轴对称所有n-1的格雷码,然后前半部分补0,后半部分补1, 就得到了n的格雷码。 class Solution { public: vector<int> grayCode(int n) { vector<int> res
阅读全文
摘要:归并两个已排序数组为一个数组,不同于归并排序的归并用一个额外的数组,这里在第一个数组预留出足够的空间,所以需要直接在第一个数组里存放原来的两个数组的所有元素。 归并排序里,是额外开一个数组,然后两个指针分别从第一个数组和第二个数组的开头进行比较,比较小的那一个元素加入新数组中,然后某个数组为空之后,
阅读全文

浙公网安备 33010602011771号