博客园markdown太烂, 题解详见https://github.com/TangliziGit/leetcode/blob/master/solution/1-10.md

Leetcode Solution 0~10

marks:

@: hard to get a direct solution

%: need optimization

好题

@@@@@ 4. Median of Two Sorted Arrays [Hard]

% 5. Longest Palindromic Substring [Medium]

@ 10. Regular Expression Matching [Hard]

总结

  1. map用法: put, get, containsKey, remove
  2. 声明数组new int[]{1, 2};
  3. 异常情况还需要返回值的话, 抛IllegalArgumentException
  4. Set的用法: add, contains, remove
  5. 数组填充: Arrays.fill(arr, -1);
  6. java中有int的最大值, Integer.MAX_VALUE
  7. int+String的形式可以进行运算, 因为自动装箱(auto-boxing)
  8. StringBuilder用法: append, toString
  9. 反转字符串需要StringBuilder.reverse()
  10. 利用java对象默认值是null, 可以避免初始化
  11. 事实上java基本类型中的数值默认值都是0, char的默认值是'\u0000'是空字符

1. Two Sum [Easy]

1. Two Sum [Easy]

思路

水题

要点

  1. map用法: put, get, containsKey, remove
  2. 声明数组new int[]{1, 2};
  3. 异常情况还需要返回值的话, 抛IllegalArgumentException

代码

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. Map<Integer, Integer> map=new HashMap();
  4. for (int i=0; i<nums.length; i++){
  5. int tmp=target-nums[i];
  6. if (map.containsKey(tmp)){
  7. int idx=map.get(tmp);
  8. if (i!=idx) return new int[]{idx, i};
  9. }map.put(nums[i], i);
  10. }
  11. throw new IllegalArgumentException();
  12. }
  13. }
2. Add Two Numbers [Medium]

2. Add Two Numbers [Medium]

思路

水题

要点

代码

  1. class Solution {
  2. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  3. ListNode head=null, tail=null, prev=null;
  4. int tmp=0;
  5. while (l1!=null || l2!=null || tmp!=0){
  6. int val=(tmp+
  7. ((l1!=null)?l1.val:0) +
  8. ((l2!=null)?l2.val:0)
  9. );
  10. tail=new ListNode(val%10);
  11. tmp=val/10;
  12. if (prev==null) head=tail;
  13. if (prev!=null) prev.next=tail;
  14. prev=tail;
  15. if (l1!=null) l1=l1.next;
  16. if (l2!=null) l2=l2.next;
  17. }
  18. return head;
  19. }
  20. }
3. Longest Substring Without Repeating Characters [Medium]

3. Longest Substring Without Repeating Characters [Medium]

思路

双指针

要点

  1. Set的用法: add, contains, remove
  2. 数组填充: Arrays.fill(arr, -1);

代码

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. int[] map=new int[128];
  4. int pre=0, pos=0, maxlen=0, len=s.length();
  5. Arrays.fill(map, -1);
  6. for (int i=0; i<len; i++){
  7. char ch=s.charAt(i);
  8. if (map[ch]>=pos) pos=map[ch]+1;
  9. map[ch]=i;
  10. pre++;
  11. maxlen=Math.max(maxlen, pre-pos);
  12. }return maxlen;
  13. }
  14. }
4. Median of Two Sorted Arrays [Hard]

@@@@@ 4. Median of Two Sorted Arrays [Hard]

思路

非常好的一道题

  1. 第一个思路是二分中位数, 同时树状数组查小于此数的数字个数, 当等于(n+m)/2时就是中位数, 这样O(log^2(n+m))

    但想到没有给数据范围, 于是树状数组不太好直接存数, 得离散化然后存, 不然数组可能开不下

  2. 第二个思路是二分中位数, 同时二分两个数组查小于此数的数字个数, 当等于(n+m)/2时就是中位数, 这样O(log(n+m)(log(n)+log(m)))

    优点是不用离散化, 但同时复杂度更差了

  3. 题解思路:

  • 首先考虑寻找第k个数的算法, 那么中位数就是他俩除二
  • 其次考虑每次寻找各序列中aMid=a[i+k/2-1]这个数

    若aMid<bMid, 说明a中[0, aMid]和[bMid, m-1]之间是没有第k值的

    显然可以分治

要点

  1. java中有int的最大值, Integer.MAX_VALUE
  2. int+String的形式可以进行运算, 因为自动装箱(auto-boxing)

代码

  1. class Solution {
  2. private int[] a, b;
  3. public double findMedianSortedArrays(int[] nums1, int[] nums2) {
  4. this.a=nums1; this.b=nums2;
  5. int n=nums1.length, m=nums2.length;
  6. if (n==0 && m==0) return 0;
  7. int left=findKth(0, 0, (n+m-1)/2+1), right=findKth(0, 0, (n+m)/2+1);
  8. return (left+right)/(double)2;
  9. }
  10. public int findKth(int ai, int bi, int k){
  11. if (bi>=b.length) return a[ai+k-1];
  12. if (ai>=a.length) return b[bi+k-1];
  13. if (k==1) return Math.min(a[ai], b[bi]);
  14. int aMid=Integer.MAX_VALUE, bMid=Integer.MAX_VALUE;
  15. if (ai+k/2-1<a.length) aMid=a[ai+k/2-1];
  16. if (bi+k/2-1<b.length) bMid=b[bi+k/2-1];
  17. if (aMid<bMid)
  18. return findKth(ai+k/2, bi, k-k/2);
  19. else return findKth(ai, bi+k/2, k-k/2);
  20. }
  21. }
5. Longest Palindromic Substring [Medium]

% 5. Longest Palindromic Substring [Medium]

思路

manacher模板

要点

  1. 注意 snull || s.length()0
  2. manacher O(n)

代码

O(n^2) version

  1. class Solution {
  2. public String longestPalindrome(String s) {
  3. if (s==null || s.length()==0) return "";
  4. int start=0, end=0;
  5. for (int i=0; i<s.length(); i++){
  6. int len=Math.max(
  7. check(i, i, s),
  8. check(i, i+1, s)
  9. );
  10. if (end-start<len){
  11. start=i-(len-1)/2;
  12. end=i+len/2;
  13. }
  14. }
  15. return s.substring(start, end+1);
  16. }
  17. private int check(int i, int j, String s){
  18. while (i>=0 && j<s.length() && s.charAt(i)==s.charAt(j)){
  19. i--; j++;
  20. }return j-i-1;
  21. }
  22. }

O(n) version

  1. class Solution {
  2. private char[] str;
  3. public String longestPalindrome(String s) {
  4. if (s==null || s.length()==0) return "";
  5. return manacher(s);
  6. }
  7. public String manacher(String s){
  8. str=new char[2*s.length()+5];
  9. str[0]='#';
  10. for (int i=0; i<s.length(); i++){
  11. str[(i<<1)+1]=s.charAt(i);
  12. str[(i<<1)+2]='#';
  13. }
  14. int n=2*s.length()+1;
  15. int mr=-1, mid=-1, maxRad=0, maxRadIdx=0;
  16. int[] rad=new int[str.length];
  17. for (int i=0; i<str.length; i++){
  18. if (mr>i) rad[i]=Math.min(rad[2*mid-i], mr-i);
  19. else rad[i]=1;
  20. while (i-rad[i]>=0 && i+rad[i]<n && str[i+rad[i]]==str[i-rad[i]]) rad[i]++;
  21. if (rad[i]+i>mr){
  22. mr=rad[i]+i; mid=i;
  23. }
  24. if (maxRad<rad[i]){
  25. maxRad=rad[i]; maxRadIdx=i;
  26. }
  27. }
  28. if (maxRadIdx%2==1)
  29. return s.substring(maxRadIdx/2-(maxRad/2-1), maxRadIdx/2+(maxRad/2-1)+1);
  30. else return s.substring((maxRadIdx/2-1)-(maxRad/2-1), maxRadIdx/2+(maxRad/2-1)+1);
  31. }
  32. }
6. ZigZag Conversion [Medium]

6. ZigZag Conversion [Medium]

思路

找规律模拟即可

要点

  1. StringBuilder用法: append, toString

代码

  1. class Solution {
  2. public String convert(String s, int numRows) {
  3. StringBuilder ans=new StringBuilder("");
  4. int len=s.length();
  5. if (numRows==1) return s;
  6. for (int x=0; x<len; x+=2*numRows-2)
  7. ans.append(s.charAt(x));
  8. for (int y=1; y<numRows-1; y++)
  9. for (int x=0; x+y<len; x+=2*numRows-2){
  10. ans.append(s.charAt(x+y));
  11. if (x+y +2*numRows-2-2*y<len)
  12. ans.append(s.charAt(x+y +2*numRows-2-2*y));
  13. }
  14. for (int x=numRows-1; x<len; x+=2*numRows-2)
  15. ans.append(s.charAt(x));
  16. return ans.toString();
  17. }
  18. }
7. Reverse Integer [Easy]

7. Reverse Integer [Easy]

思路

水题

要点

代码

  1. class Solution {
  2. public int reverse(int x) {
  3. if (x<0) return -1*solve(-1*x);
  4. return solve(x);
  5. }
  6. private int solve(int x){
  7. long res=0;
  8. while (x!=0){
  9. res=res*10+x%10;
  10. x/=10;
  11. }
  12. if (res<-(long)1<<31 || res>=(long)1<<31) return 0;
  13. return (int)res;
  14. }
  15. }
8.String to Integer (atoi)[Medium]

% 8.String to Integer (atoi)[Medium]

思路

垃圾模拟题

要点

考虑正则匹配

代码

  1. class Solution {
  2. public int myAtoi(String str) {
  3. int sign=1, i=0, ans=0;
  4. str = str.trim();
  5. if (str.isEmpty()) return 0;
  6. else if (str.charAt(i)=='+') i++;
  7. else if (str.charAt(i)=='-') {i++; sign=-1;}
  8. while (i<str.length() && Character.isDigit(str.charAt(i))) {
  9. int ch=str.charAt(i)-'0';
  10. if (ans>(Integer.MAX_VALUE-ch)/10)
  11. return sign>0?Integer.MAX_VALUE:Integer.MIN_VALUE;
  12. ans=ans*10+ch;
  13. i++;
  14. }
  15. return sign*ans;
  16. }
  17. }
9. Palindrome Number [Easy]

9. Palindrome Number [Easy]

思路

水题

要点

  1. 反转字符串需要StringBuilder.reverse()

代码

  1. class Solution {
  2. public boolean isPalindrome(int x) {
  3. StringBuilder ori=new StringBuilder(String.valueOf(x));
  4. ori.reverse();
  5. return ori.toString().equals(String.valueOf(x));
  6. }
  7. }
10. Regular Expression Matching [Hard]

@ 10. Regular Expression Matching [Hard]

思路

有点类似正则匹配的图, 画一个类似nfa一样的自动机可以发现是个dp, 模板串的状态用j表示, 那么待匹配串状态用i

要点

  1. 利用java对象默认值是null, 可以避免初始化
  2. 事实上java基本类型中的数值默认值都是0, char的默认值是'\u0000'是空字符

代码

  1. class Solution {
  2. enum Result{
  3. TRUE, FALSE
  4. }
  5. private Result[][] res;
  6. private String s, p;
  7. public boolean isMatch(String s, String p) {
  8. this.s=s; this.p=p;
  9. res=new Result[s.length()+1][p.length()+1];
  10. return dp(0, 0);
  11. }
  12. private boolean dp(int i, int j){
  13. if (j==p.length()) return i==s.length();
  14. if (res[i][j]!=null) return res[i][j]==Result.TRUE;
  15. boolean match=(
  16. i<s.length() &&
  17. (s.charAt(i)==p.charAt(j) || p.charAt(j)=='.')
  18. ), tmp;
  19. if (p.length()>j+1 && p.charAt(j+1)=='*')
  20. tmp=(dp(i, j+2) || (match && dp(i+1, j)));
  21. else
  22. tmp=(match && dp(i+1, j+1));
  23. res[i][j]=tmp?Result.TRUE:Result.FALSE;
  24. return tmp;
  25. }
  26. }

[leetcode] 题解记录 1-10的更多相关文章

  1. [leetcode] 题解记录 11-20

    博客园markdown太烂, 题解详情https://github.com/TangliziGit/leetcode/blob/master/solution/11-20.md Leetcode So ...

  2. LeetCode 题解 | 面试题 10.01. 合并排序的数组

    给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: 输入: A = [ ...

  3. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  4. [LeetCode题解]: Sort Colors

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given an a ...

  5. LeetCode题解: LRU Cache 缓存设计

    LeetCode题解: LRU Cache 缓存设计 2014年12月10日 08:54:16 邴越 阅读数 1101更多 分类专栏: LeetCode   版权声明:本文为博主原创文章,遵循CC 4 ...

  6. LeetCode解题记录(贪心算法)(二)

    1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...

  7. [LeetCode 题解]:Palindrome Number

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Determine ...

  8. 【LeetCode题解】7_反转整数

    目录 [LeetCode题解]7_反转整数 描述 方法一 思路 Java 实现 类似的 Java 实现 Python 实现 方法二:转化为求字符串的倒序 Java 实现 Python 实现 [Leet ...

  9. 【LeetCode题解】2_两数相加

    目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...

随机推荐

  1. kotlin class

    每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托.委托到同一个类的另一个构造函数用 this 关键字即可 class Person { constructor(pare ...

  2. jeecg中列表点击单号跳入链接

    效果如图:点击单号,跳到一个新的页面 1.首先列表给一个自定义的js: <t:dgCol title="业务编号"  field="orderCode" ...

  3. 怎么去检测浏览器支不支持html5和css3?

    HTML5, CSS3 以及其他相关技术例如 Canvas.WebSocket 等等将 Web 应用开发带到了一个新的高度. 该技术通过组合 HTML.CSS 和 JavaScript 可以开发出桌面 ...

  4. <linux-sed> sed基本用法

    1.简介 sed全称是Stream Editor,是非交互式的编辑器.它不会修改原文件,除非使用shell重定向来保存结果, 或者可以指定-i选项来在线修改文件,这样就会改变原文件,升级脚本通常用-i ...

  5. SpringBoot: 2.SpringBoot整合servlet(转)

    整合方式1:通过注解扫描完成 Servlet 组件的注册 1.编写servlet package com.bjsxt.servlet; import javax.servlet.ServletExce ...

  6. RocketMQ之十:RocketMQ消息接收源码

    1. 简介 1.1.接收消息 RebalanceService:均衡消息队列服务,负责通过MQClientInstance分配当前 Consumer 可消费的消息队列( MessageQueue ). ...

  7. Web后台管理系统

    开发语言:C# 数据库:sql2008 登录页面 后台管理首页 部分操作页面 后台管理系统,界面简洁,大方,操作简单,所有功能可定制开发. 后台管理系统制作 如果您有需要后台管理系统制作,请扫描添加微 ...

  8. Exchange Server 2010安装

    Exchange Server 2010安装  Exchange Server 2010是Microsoft最新的邮件服务器软件,功能比较强大.在此,我们在虚拟机中安装体验一下,主要步骤如下: (1) ...

  9. 记录运行时间 StopWatch

  10. 输入一个数值num,对1到num的所有的数值进行全排列

    输入一个数值num,对1到num的所有的数值进行全排列: 其实这个题目可以看成是将1到num个数字放入num个有序的盒子里面:当将最后一个数字放入盒子里的时候,就输出所有盒子里的数字:这就是一个排列的 ...