楼主: love1point
跳转到指定楼层
上一主题 下一主题
收起左侧

Leetcode 刷题记录!!!不信自己今年找不到工作!!!

 
🔗
 楼主| love1point 2015-6-28 20:18:28 | 只看该作者
全局:
path sum ii:   https://leetcode.com/problems/path-sum-ii/


idea: 一看这题又是用dfs解决的,套上dfs的模板,代码很快敲出来,这三行代码是我出错的地方,
我一直在想用 result.add(l) 这一行代替以下这三行。但总是不行。实际上dfs题目需要这样写,避免 l 里最后一个数据被抹了。
credit to zhuli19901106 的讨论哈

   ArrayList<Integer> temp = new ArrayList<Integer>();
             temp.addAll(l);
             result.add(temp);
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11.     public List<List<Integer>> pathSum(TreeNode root, int sum) {
  12.         List<List<Integer>> result = new ArrayList();
  13.         if(root == null)
  14.         {
  15.             return result;
  16.         }
  17.         ArrayList<Integer> l = new ArrayList<Integer>();
  18.         l.add(root.val);
  19.         dfs(root, sum-root.val, l, result);
  20.         return result;
  21.     }
  22.    
  23.     public void dfs(TreeNode node, int sum, ArrayList<Integer> l, List<List<Integer>> result)
  24.     {
  25.         if(node.left == null && node.right == null && sum == 0)
  26.         {
  27.              ArrayList<Integer> temp = new ArrayList<Integer>();
  28.              temp.addAll(l);
  29.              result.add(temp);
  30.         }
  31.         
  32.         if(node.left != null)
  33.         {
  34.             l.add(node.left.val);
  35.             dfs(node.left, sum - node.left.val, l, result);
  36.             l.remove(l.size()-1);
  37.         }
  38.         
  39.         if(node.right != null)
  40.         {
  41.             l.add(node.right.val);
  42.             dfs(node.right, sum - node.right.val, l, result);
  43.             l.remove(l.size()-1);
  44.         }
  45.     }
  46. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-30 18:27:19 | 只看该作者
全局:
Remove Nth Node From End of List : https://leetcode.com/problems/remove-nth-node-from-end-of-list/

idea: 先算出链表长度,然后指针跑到要被删除节点的前一个节点,然后把要被删除节点的前一个节点的next 指向 要被删除节点的下一个。但有bug,就是这种[1], 1
解决bug的方法,加个判断,我发现这个是我之前代码没过的原因,就是要删的是表头,怎么处理,我加了处理这种情况的代码就过了哈,多亏 zhuli19901106 的提醒
if(length == n)
        {
            head = head.next;
            return head;
        }
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. *     int val;
  5. *     ListNode next;
  6. *     ListNode(int x) { val = x; }
  7. * }
  8. */
  9. public class Solution {
  10.     public ListNode removeNthFromEnd(ListNode head, int n) {
  11.         int length = 0;
  12.         ListNode p = head;
  13.         while(p != null)
  14.         {
  15.             length++;
  16.             p = p.next;
  17.         }
  18.         
  19.         p = head;
  20.         
  21.         if(length == n)
  22.         {
  23.             head = head.next;
  24.             return head;
  25.         }
  26.         
  27.         for(int i = 0; i < length - n - 1; i++)
  28.         {
  29.             p = p.next;
  30.         }
  31.    
  32.         p.next = p.next.next;
  33.         return head;
  34.     }
  35. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-3 11:05:23 | 只看该作者
全局:
Majority element ii:  https://leetcode.com/problems/majority-element-ii/

idea: 这题要求常量空间,自然不能考虑hashmap了。用到了一下这个算法思想解决:  http://www.cs.rug.nl/~wim/pub/whh348.pdf
  1. public class Solution {
  2.     public List<Integer> majorityElement(int[] nums) {
  3.         List<Integer> result = new ArrayList<Integer>();
  4.         int a = 0;
  5.         int b = 0;
  6.         int counta = 0;
  7.         int countb = 0;
  8.         
  9.         for(Integer i : nums)
  10.         {
  11.             if(i == a)
  12.             {
  13.                 counta++;
  14.             }
  15.             else if(i == b)
  16.             {
  17.                 countb++;
  18.             }
  19.             else if(counta == 0)
  20.             {
  21.                 a = i;
  22.                 counta++;
  23.             }
  24.             else if(countb == 0)
  25.             {
  26.                 b = i;
  27.                 countb++;
  28.             }
  29.             else
  30.             {
  31.                 counta--;
  32.                 countb--;
  33.             }
  34.         }
  35.         
  36.         counta = 0;
  37.         countb = 0;
  38.         
  39.         for(Integer i : nums)
  40.         {
  41.             if(i == a)
  42.             {
  43.                 counta++;
  44.             }
  45.             else if(i == b)
  46.             {
  47.                 countb++;
  48.             }
  49.         }
  50.         
  51.         if(counta > nums.length / 3)
  52.         {
  53.             result.add(a);
  54.         }
  55.         
  56.         if(countb > nums.length / 3)
  57.         {
  58.             result.add(b);
  59.         }
  60.         
  61.         return result;
  62.         
  63.     }
  64. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-3 17:43:49 | 只看该作者
全局:
kth smallest element in a bst: https://leetcode.com/problems/kth-smallest-element-in-a-bst/

idea: bst 中序遍历有序。其实这题很早就有了,只不过lc最近才加进来。 注意这个, 这里是 p = q.right; 而不是 p= p.right

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11.     public int kthSmallest(TreeNode root, int k) {
  12.         int result = 0;
  13.         Stack<TreeNode> s = new Stack<TreeNode>();
  14.         TreeNode p = root;
  15.         
  16.         while(!s.isEmpty() || p != null)
  17.         {
  18.             if(p != null)
  19.             {
  20.                 s.push(p);
  21.                 p = p.left;
  22.             }
  23.             else
  24.             {
  25.                 TreeNode q = s.pop();
  26.                 k--;
  27.                 if(k == 0)
  28.                 {
  29.                     result = q.val;
  30.                 }
  31.                 p = q.right;
  32.             }
  33.         }
  34.         return result;
  35.     }
  36. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-3 18:30:26 | 只看该作者
全局:
本帖最后由 love1point 于 2015-7-3 18:53 编辑

Basic calculator:  https://leetcode.com/problems/basic-calculator/

idea: 没啥算法思想,就是分情况讨论

感谢 zhuli19901106 提醒。 这行 cur = cur * 10 + s.charAt(++i) - '0';
如果写成 cur = cur * 10 + s.charAt(i+1) - '0'; 就超 因为i 不变了,死循环。
  1. public class Solution {
  2.     public int calculate(String s) {
  3.         int result = 0;
  4.         int sign = 1;
  5.         Stack<Integer> stack = new Stack<Integer>();
  6.         
  7.         for(int i = 0; i < s.length(); i++)
  8.         {
  9.             char c = s.charAt(i);
  10.             if(Character.isDigit(c))
  11.             {
  12.                 int cur = c - '0';
  13.                 while(i + 1 < s.length() && Character.isDigit(s.charAt(i+1)))
  14.                 {
  15.                     cur = cur * 10 + s.charAt(++i) - '0';
  16.                 }
  17.                 result = result + cur * sign;
  18.             }
  19.             else if(c == '+')
  20.             {
  21.                 sign = 1;
  22.             }
  23.             else if(c == '-')
  24.             {
  25.                 sign = -1;
  26.             }
  27.             else if(c == '(')
  28.             {
  29.                 stack.push(result);
  30.                 result = 0;
  31.                 stack.push(sign);
  32.                 sign = 1;
  33.             }
  34.             else if(c == ')')
  35.             {
  36.                 result = stack.pop()*result + stack.pop();
  37.                 sign = 1;
  38.             }
  39.         }
  40.         return result;
  41.         
  42.     }
  43. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-6 18:09:58 | 只看该作者
全局:
Power of two:  https://leetcode.com/problems/power-of-two/

idea: 这题为位操作题。
  1. public class Solution {
  2.     public boolean isPowerOfTwo(int n) {
  3.         if( n <= 0)
  4.         {
  5.             return false;
  6.         }
  7.         
  8.         if((n & (n - 1)) == 0)
  9.         {
  10.             return true;
  11.         }
  12.         return false;
  13.     }
  14. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-6 19:00:51 | 只看该作者
全局:
Count complete tree nodes: https://leetcode.com/problems/count-complete-tree-nodes/
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11.     public int countNodes(TreeNode root)
  12.     {
  13.         if(root == null)
  14.         {
  15.             return 0;
  16.         }
  17.         
  18.         int left = getLeft(root) + 1;
  19.         int right = getRight(root) + 1;
  20.         
  21.         if(left == right)
  22.         {
  23.             return (2<<(left - 1)) - 1;
  24.         }
  25.         else
  26.         {
  27.             return countNodes(root.left) + countNodes(root.right) + 1;
  28.         }
  29.     }
  30.    
  31.     public int getLeft(TreeNode root)
  32.     {
  33.         int count = 0;
  34.         while(root.left != null)
  35.         {
  36.             count++;
  37.             root = root.left;
  38.         }
  39.         return count;
  40.     }
  41.    
  42.     public int getRight(TreeNode root)
  43.     {
  44.         int count = 0;
  45.         while(root.right != null)
  46.         {
  47.             count++;
  48.             root = root.right;
  49.         }
  50.         return count;
  51.     }
  52. }
复制代码

点评

这种写法参考了网上的思路哈  发表于 2015-7-10 16:01

评分

参与人数 1大米 +3 收起 理由
zhuli19901106 + 3 有意思的写法

查看全部评分

回复

使用道具 举报

全局:
楼主 我要步你后尘了!
回复

使用道具 举报

本楼:
全局:
一起加油!
回复

使用道具 举报

🔗
 楼主| love1point 2015-7-8 21:48:27 | 只看该作者
全局:
PickleRickPapa 发表于 2015-7-8 01:41
楼主 我要步你后尘了!

啥后尘?刷题找工作吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表