前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于这段时间刷算法的总结

关于这段时间刷算法的总结

作者头像
用户6055494
发布2019-12-15 19:20:12
3970
发布2019-12-15 19:20:12
举报
文章被收录于专栏:AVAJAVAJ

11月份,也就是上个月,在leetCode上大概AC了100多道题吧,之前有刷几个是按默认顺序来刷的,不得不说如果有小伙伴和我一样没有什么数据结构基础及算法基本的常识,最好不要按顺序刷,遇到一些Medium和Hard心态真的容易崩,所以这里我主要是按难度来刷的,所以这个100多道有80来道是Easy的

(大佬请绕路),自从换了刷题方式之后,我感觉自信慢慢的提升了不少,当然之前在论坛有些大佬建议按Tag刷,我这里不推荐新手这么搞,如果真的想按Tag刷建议从Array、String等这些基础的入手。

下面给出了一些我AC过的题。

斐波那契数和爬楼梯这些题应该是最简单的dp,不要用迭代,栈很容易就满了,一般涉及到树的最大深度,层次遍历,对称二叉树等用递归特别好用。

代码语言:javascript
复制
// 树的最大深度
 public int maxDepth(TreeNode root) {
        if(null == root) return 0;
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));  
    }
代码语言:javascript
复制
// 对称二叉树
public boolean isSymmetric(TreeNode root) {
    return isMirror(root, root);
}

public boolean isMirror(TreeNode t1, TreeNode t2) {
    // 对称的条件
    if (t1 == null && t2 == null) return true;
    if (t1 == null || t2 == null) return false;
    // 递归
    return (t1.val == t2.val)
        && isMirror(t1.right, t2.left)
        && isMirror(t1.left, t2.right);
}

还有一类用快慢双指针:判断链表是否有环

代码语言:javascript
复制
public boolean hasCycle(ListNode head) {
    if (head == null || head.next == null) return false;
    // 慢指针
    ListNode slow = head;
    // 快指针
    ListNode fast = head;
        while (fast.next != null && fast.next.next != null) {
      slow = slow.next; 
      fast = fast.next.next;
        // 当快慢指针相同时,则说明是在圆环里面
      if (slow == fast) {
        return true;
      }
    }
    return false;
}

相交链表巧妙解题

代码语言:javascript
复制
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        ListNode a = headA;
        ListNode b = headB;
        while(a!=b) {
            // a遍历完遍历b
            a = a==null?headB:a.next;
            // b遍历完遍历a
            b = b==null?headA:b.next;
        }
        return a;
    }

还有通过二进制位来解题

代码语言:javascript
复制
// 非空数组 一个数只出现过一次 其他数都出现过俩次
 public static int singleNumber(int[] nums) {
2         int num = 0;
3         for (int i = 0; i < nums.length; i++) {
              // 相同的数异或为0
4             num = num ^ nums[i];
5         }
6         return num;
7     }

也有通过贪心的如切绳子、最长回文子串的中心扩展法,大部分涉及数组的题目用HashMap存,能够方便很多。阶乘后面的0,其实就是判断除以5。这些都是小技巧。

然后很恐怖的事情总是悄悄发生,我刷着刷着发现前面刷的已经忘的差不多,问过好些刷题的朋友,很正常的情况,但是一定要多多总结,还有就是周赛的话最好也打一下,一般AC俩个(很下饭)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档