![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
whu_sky
每天都要有所收获才会觉得不是虚度光阴
展开
-
LeetCode:LRU Cache
这题我个人感觉非常经典,虽然我们再操作系统上学过FIFO,random,LRU等好几种替换算法,但是实际上我们只是知道它的原理,却不知道怎么实现。我以前一直以为这种Cache是很难实现的一个东西,没想到看了两三个小时就可以做出来了,其实过程还是很简单的,一步一步来就好了。先说LRU的原理,LRU是Least Recently Used 近期最少使用算法。内存管理的一种页面置换算法,对于原创 2014-03-27 18:05:26 · 912 阅读 · 0 评论 -
LeetCode:3Sum Closest
这道题跟3Sum也很像,大致框架没有什么区别,也是先排序,排序完了之后对数组进行遍历。每次计算时,有个distance变量来比较是不是最小距离,是最小距离就把当前的target_cur记录下来,最后返回distance最小的的target_cur。class Solution {public: int threeSumClosest(vector &num, int target原创 2014-03-25 15:20:43 · 484 阅读 · 0 评论 -
LeetCode:3Sum
这道题直接采用网上的思路,先对数组进行排序,然后遍历数组的每一个元素i,对于每一个i,定义j,k两个变量,表示从i+1和num.size()两个头尾指针,若num[i]+num[j]+num[k]三者之和大于0,k往前移,三者和小于0,j往后移,知道target=0。这道题唯一比较麻烦的地方就在于可能出现重复解,所以增减判断前后两个元素相同时,只去后面那个元素,每次循环开始的元素不考虑。还有就原创 2014-03-25 14:14:32 · 516 阅读 · 0 评论 -
LeetCode:Reverse Words in a String
首先声明,我既不是算法大牛,也不是项目老手,只是一个非常平凡的CSer。觉得自己基础不是很好,所以打算开始刷Leetcode的题,用博客来把的一些想法分享给大家。public class Solution { public String reverseWords(String s) { int count=0; int start=0; int end=s原创 2014-03-18 11:42:00 · 625 阅读 · 0 评论 -
LeetCode:Evaluate Reverse Polish Notation
LeetCode的第二道,计算逆波兰式。大二上的时候老师就讲过逆波兰式这个东西,平常我们做的运算,即中缀表达式。首先将中缀表达式转化为后缀表达式(逆波兰式)再又堆栈进行处理,十分的方便,我也是做了这道题后才深有感触。逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:正常的表达原创 2014-03-18 16:25:47 · 709 阅读 · 0 评论 -
LeetCode:Two Sum
Two Sum即时讲两个元素相加为指定的target元素,这题比较简单,我直接用的java map类型。将元素压到原创 2014-03-19 08:46:17 · 508 阅读 · 0 评论 -
LeetCode:Median of Two Sorted Arrays
比较两个已排序数组再求其中位数,是很基础的一道题目。在我们做合并排序之前就需要做的这一步,基本思路是新建两个指针,指向数组首部,比较两个数组的最小值,元素较小的那个数组向后移,知道两个指针指向下标和超过(m+n)/2。或者也可以想我一样,直接按前面方法将两个数组合并。public class Solution { public double findMedianSortedArra原创 2014-03-19 11:12:34 · 592 阅读 · 0 评论 -
LeetCode:Sort List
这道题可以用快排的变形也可以用mergeSort合并排序来处理,我用的是合并排序。即一个函数mergeSort处理讲链表二份,再用递归的方法合并排序,另外一个函数Merge来处理链表合并。需要注意的就是链表二分时判断条件和原来的那个链表要从中间断开。/** * Definition for singly-linked list. * struct ListNode { *原创 2014-03-24 16:14:57 · 524 阅读 · 0 评论 -
LeetCode:Sqrt(x)
心碎的一道题 啊,其实是蛮简单的,但是我想复杂了。在用二分法的时候是在想不好判断条件应该返回哪个值,mid,high还是low,最后发现low跟mid都有可能超过正确值,只有high一定大于等于正确值,枚举一下就好了。还有数值的大小一定要设成unsigned long long,不然开根号算的数值不够大。class Solution{ public: int sqrt(int x){原创 2014-03-27 10:44:24 · 617 阅读 · 0 评论 -
LeetCode:Pow(x, n)
这道题其实是蛮心碎一地的,一开始我用对称性,即返回pow(x,n/2)*pow(x,n/2)总是说我超时,后来写到另外一个函数里去,还是一样,最后一定要将pow(x,n/2)赋一个值,感觉有点莫名其妙的好奇怪。可能是因为递归函数时间空间占用的太多了。class Solution {public: double div(double x,int n){ if(n==0)return 1.原创 2014-03-27 11:37:21 · 542 阅读 · 0 评论 -
LeetCode:4Sum
如果这道题采用我上道3Sum的思路就很简单,只要外层再加一层循环就可以了。在最外层在定义一层循环m,原来的target就变成target-num[m],然后再用我前面3Sum的思路就可以轻松AC了。3Sum参考地址:3Sumclass Solution {public: vector > fourSum(vector &num, int target) { ve原创 2014-03-25 14:29:14 · 476 阅读 · 0 评论 -
LeetCode:Single Number
这题想不到很难,想到了就很简单。利用以前C++学过的异或运算,因为太少用了吧,所以想了半天都没想到,代码很简单。class Solution {public: int singleNumber(int A[], int n) { int x=0; for(int i=0;i<n;i++){ x=x^A[i]; } retur原创 2014-03-26 09:06:08 · 512 阅读 · 0 评论 -
LeetCode:Reverse Integer
这题没什么难度,感觉也没什么好说的。设置一个标志位表示正负,再不断循环就好了。class Solution {public: int reverse(int x) { int flag=x>0?1:-1; int y=abs(x); int sum=0; while(y){ sum=10*sum+y%10; y=y/10; }原创 2014-03-25 17:17:42 · 533 阅读 · 0 评论 -
LeetCode:Binary Tree Postorder Traversal
数据结构学过树的遍历吧,有先序遍历,中序遍历,后序遍历,就是父亲节点应该放哪个位置, 父节点放最前面就是先序遍历,以此类推。我这题用的迭代的方式,当然很简单。先序遍历指先访问根,然后访问孩子的遍历方式,其C代码如下:void XXBL(tree* root){//Do Something with rootif(root->lchild!=NULL)XXBL(root-原创 2014-03-28 09:49:56 · 689 阅读 · 0 评论 -
LeetCode:Binary Tree Preorder Traversal
图的先序遍历,由于上一题后序遍历使用的是递归的方法,所以我这次用的就是迭代。跟递归一样,迭代也要注意两方面,一方面就是迭代循环的判断条件,相当于递归的出口,还有就是迭代的函数,跟递归的函数类似这题。今天特意看了递归和迭代的原理,与其说递归是一种算法,其实递归更像是一种思想,一种方便我们考虑的思想,迭代就是一种结构,不断循环的结构。为了理解递归的工作原理,你需要追踪递归调用的执行原创 2014-03-28 15:05:54 · 980 阅读 · 0 评论 -
LeetCode:Longest Substring Without Repeating Characters
本题主要是是求最长的同样不重复字母的子串,网上有说用动态规划来解决,但是个人感觉动态规划的条件很难想象。鉴于Java实在是太重, 同样的算法,用Java运行的时间远远要大于C++,所以为了防止java跑的太慢导致超时,我打算开始用C++写LettCode的OJ。我做这题的思路,主要是设置两个数组,一个exist数组记录,子串里字母元素是否存在,一个position数组记录存在的字母对应的字原创 2014-03-20 18:33:49 · 566 阅读 · 0 评论 -
LeetCode:Reorder List
这道题明显不是很难,但莫名其妙的总是出现WA,最后直接重写了一遍还是没发现哪里错了,好歹还是AC了。首先按题目要求,我们分几步走,先把整个链表拆成两半,要保证前面节点比后面多。然后将后面部分的链表反转,最后将得到的后半部分链表依次有间隔的插入前半部分的链表中。利用快慢指针可以讲链表拆成两半,然后用迭代递归方法都可以反转链表,间隔插入元素也很简单。class Solution { p原创 2014-04-01 17:26:55 · 652 阅读 · 0 评论 -
LeetCode:Linked List Cycle
这题很简单,快慢指针就行了,一个pfast步长为2,一个pslow步长为1,若有环的话,pfast一定会等于pslow。无环,则肯定不会。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : va原创 2014-04-01 18:08:34 · 731 阅读 · 0 评论 -
LeetCode:Linked List Cycle II
这道题代码难度并不大,主要是在于怎么想两个快慢指针的运动。假设轨道长是K1,经过m步,慢指针pslow到达轨道的K2位置与pfast相等。所以得到第一个等式K1+K2=m。(1)此时pfast跑了2m步,即K1+K2+xl=2m。(l指圈长,x指圈数)。此时把pfast移到head处,步长改为1,经过K1步,刚到到达环开始处,而此时,pslow从K2经过K1步,经过(1)等式,刚好也在原创 2014-04-02 08:57:41 · 799 阅读 · 0 评论 -
LeetCode:Add Two Numbers
这题可以说是花了我很久的一道题,说实话感觉以前链表知识学得很好,但是实际动手起来就会发现其实自己有很多问题不懂。比如链表指针再动的时候,没有加另外再赋值一个头指针,不这样在单链表里就没办法找到原来的头指针。再比如,用pushBack方法压入数据是,链表的指针应该再移一位。作为一个大三的学生了,现在才会利用好链表觉得还是满惭愧的。这道题我本来是想把l1和l2的数据先表示出来再求和,再把和存到链表原创 2014-03-24 00:05:50 · 648 阅读 · 0 评论 -
LeetCode:Insertion Sort List
这道题感觉最难的地方就在于链表节点的移动。因为链表不像数组,元素的移动很不方便,所以加了一个tmp变量,不断做循环交换来移动链表里的数组。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(原创 2014-03-24 18:08:22 · 493 阅读 · 0 评论 -
LeetCode:Max Points on a Line
这道题想法比较中规中矩,只要遍历每一个点,每点与其他点做连线,斜率一样就好。但是这题有很多陷阱,比输入为空,出入很多重复点,重复点是不能算斜率无穷或0,但是所以通过的直线计算点数都要加上重复点。还有斜率问题,在计算K时要进行强制类型转换。/** * Definition for a point. * struct Point { * int x; * int y;原创 2014-03-24 14:47:15 · 503 阅读 · 0 评论 -
LeetCode:Single Number II
这题还是挺有意思的,你可以用map数据结构来find(A[I])解决,也可以用位运算符。位运算方法比较有意思,就是统计数组上化成二进制后每一位上1出现的次数,用one记录出现次数是否为1次(mod 3),two记录1出现的次数是否为2次(mod 3),一旦one two同时唯一,说明1出现的次数为3次了。然后one two重置。class Solution {public: in原创 2014-03-27 13:50:28 · 639 阅读 · 0 评论