随笔分类 - leetcode
自己的解题记录
摘要:最近在刷leetcode,经常要使用sort包里面提供的查找和排序的函数,所以对其中使用比较多的方法做简单介绍。 首先是golang 标准库在线文档的索引 Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com) 1.排序 对于
阅读全文
摘要:排序算法的分类如下 各个算法的时间和空间代价如下 注:另外还有一个时间代价为O(N)的桶排序算法,局限性比较大,感兴趣可以另作了解。 那么,如何选择各个排序算法呢? 1. 首先,在待排序数组长度比较短的情况下,使用简单排序算法效果比较好。 在简单排序算法中,直接插入排序的平均情况是相对较好的。而简单
阅读全文
摘要:这题有很多破坏链表结构的简单解法。。就先不考虑了。 在不破坏链表的情况下,可以使用哈希表法或者快慢指针,两种方法的时间代价都是O(n)。 其中哈希表法可以判断链表是否有环,或者用来找到环入口。和快慢指针法相比是空间代价为O(n)。 快慢指针法可以用来判断是否有环,求环的长度(快慢指针第二次相遇和第一
阅读全文
摘要:官方题解给出三个方法。 方法一为利用一个二维数组记录值,然后遍历数组去判断是否回文。时间代价和空间代价都为O(n)。 实现代码如下 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *
阅读全文
摘要:思路一,迭代法,借助哑节点来忽略边界问题。 实现代码如下 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nul
阅读全文
摘要:两种思路,用递归或者迭代实现。理论性能差不多。虽然递归会比迭代多很多的函数调用栈开销。。 递归代码如下(能够使用递归法的两要素,出口,以及子问题是相同解法的更简单问题) /** * Definition for singly-linked list. * struct ListNode { * in
阅读全文
摘要:主要有三个办法。 最简单的方法是遍历两边链表。 最好的办法是遍历一遍链表解决问题。用双指针法,一个快指针,一个慢指针。快指针先出发N-1步。然后两个指针同步调移动直到快指针指向尾节点,此时慢指针指向的就是要删除的节点。(其实你需要知道的是被删除节点的前一个节点,但首节点前面没有节点呀,通过引入哑节点
阅读全文
摘要:这题怪不得那么人吐槽。要删除链部节点却不给链部头节点,只给一个要删的节点的地址。。。 这个题目其实没有任何实际意义,题目给了许多约束条件,才能够“在仅给出要删的节点的条件下实现删除节点操作”。。。(比如,被删除的节点不能是最后一个节点) 中文力扣的翻译也有问题,整的像个脑筋急转弯。 实现代码如下 /
阅读全文
摘要:这题就是典型的字符串匹配问题。实现方法可谓极多。而且网上教程实在很详尽了。故不多赘述啦。贴我个人码了一遍的代码。。 感兴趣的直接参考下面这些大神的博客哈哈 https://www.zhihu.com/question/21923021 http://www.voidcn.com/article/p-
阅读全文
摘要:这题目,两种典型的思路,第一种,直接按照题目要求来做就好了。把前面的空格符跳过,处理±符号,然后将数字字符不断累加转换即可。 关键的一个点是如何判断溢出问题,用来记录答案的中间变量可以定义为long long变量(注意long和int都是四字节,usigned int也是不可取的,范围仍旧不满足要求
阅读全文
摘要:题目的意思就是检查一个字符串是不是另一个字符串乱序后的串。两者的元素值及对应的个数都相等。 最简单的做法就是排序,然后逐元素对比。时间复杂度位O(nlogn) 代码如下 class Solution { public: bool isAnagram(string s, string t) { if(
阅读全文
摘要:这题地最优时间复杂度是O(n).因为需要知道某个字符是不是唯一的,那么必须要遍历一遍数组。在第一遍遍历的过程中,想要同时保存最小唯一字符偏移量是不可能的。 第一遍遍历过程中,记录这些唯一字符的偏移量,然后在这些偏移量最小的当中找到答案即可。 由于题目默认字符串中的字符为小写英文字母,故使用26大小的
阅读全文
摘要:看到这题最直接的思路,是想着先转化为字符串再反转,然后转化为整数输出。转化为输出的时候需要考虑溢出的情况。而且如何对负数的字符串进行处理每个人也有各自的方法。 以下记录一个看到的题解比较清晰的实现 class Solution { public: int reverse(int x) { long
阅读全文
摘要:本题的最经典思路是使用滑动窗口或者动态规划。 例如滑动窗口,建立起始指针和结尾指针。可以保证结尾指针一定是在起始指针右边的。那么只要每次移动结尾指针至有重复字符,然后再移动起始指针。如此重复至遍历完字符串即可。查找窗口里是否存在子串则使用建立哈希表的方法将时间复杂度降为O(1)。 这样子总的时间复杂
阅读全文
摘要:这题要求顺时针旋转二维数组九十度,那也就是把二维数组转置后再横向对称一次。 我的实现代码如下 class Solution { public: void rotate(vector<vector<int>>& matrix) { int len=matrix.size(); for(int i=0;
阅读全文
摘要:这题的重点在于如何用更短的时间代价去判断某个数组是否存在重复元素。 之前的题目,对于这种问题,最典型的要么就是排序,要么就是哈希。某些情况也可以用位运算去判重。这题我暂时没去看位运算相关的解法。 排序后再查重的时间效率一般,暂且不考虑。而这个数独无非是九×九的二维数组,即使使用额外的空间,也不必太纠
阅读全文
摘要:这题是“两个数组的交集”问题的第二版,多了一个“输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。”这个要求。 但仍旧可以用哈希法来做。对其中数组建立哈希表,其中键为元素值,值为元素频率。遍历另一个数组的元素,每在哈希表中找到相同元素,那么就把其对应频率减1并把数组当前元素放入
阅读全文
摘要:此题解法思路很多。我只说一下自己的实现的两个方法。 第一种,遍历数组,同时删除每个零元素并记录个数,最后在尾部后面添加删除个数的零即可。思路清晰简单。效率一般。 代码如下 class Solution { public: void moveZeroes(vector<int>& nums) { in
阅读全文
摘要:这个题目很简单,不写思路了,奇怪的是我的代码运行时间是0ms。可能leetcode的计时机制有点bug吧。。。 代码如下 1 class Solution { 2 public: 3 vector<int> plusOne(vector<int>& digits) { 4 int i=0; 5 fo
阅读全文
摘要:解法一,排序数组,然后遍历。时间复杂度取决于排序算法。 代码如下 1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 if(nums.size()==1)return nums[0]; 5 sort(nums.
阅读全文