leetcoder题目java_GitHub - SuperMarioX/leetcode-java: leetcode 解题方法 Java 语言描述,包含各种常见解题模板和各个题目出题频率...

Leetcode 题解

不是每道题都会一一解答,重在思想,使用模板来解题,达到触类旁通!

doc中有好几份文档,比较经典,可以参考。

基本数据结构定义

常用解题模板

leetcode高频题目录

frequencey 5

难度 ※※

数据结构 array、set

算法 sort、tow pointers

思路 hashmap

难度 ※※

数据结构 string

算法 math

思路

trim后看是不是空

第一位是不是有正负 符号

接下去位数有没有 str.charAt(i)'9'

如果是正常数值value=10*value+str.charAt(i)-'0';

最后在和integer max/min value

难度 ※※※

数据结构 array

算法 two pointer

思路 for循环 外层控制I 内层控制left,right 然后i+left+right==0 就是答案。 注意先sort 数组 当中去重

难度 ※※

数据结构 string

算法 stack

思路 用stack实现,左括号add 右括号pop 然后比较是否是pair

难度 ※※

数据结构 linkedlist

算法 sort, two pointers, merge

思路 遍历过程中比较两个链表的头元素

难度 ※※※※

数据结构 string

算法 two pointers, KMP, rolling hash, BM

思路

for (int i = 0; i < h_len - n_len + 1; i++) { //剩下的不够匹配完整needle就不用再循环了

for (int j = 0; j < n_len; j++) { //因为是从haystack的i位和needle的0位开始比

if (haystack.charAt(i + j)!=needle.charAt(j)){//所以直接是haystack i+j..和neddle的j比 j从0开始

难度 ※※※

算法 binary search, math

思路

先处理负指数,1.0/pow2(x,-n)

然后再用二分思想处理问题 因为指数的运算规律2^8=2^42^4 所以 double result=pow2(x, n/2);然后 return的时候如果指数为偶数就 return resultresult 基数就在补乘个x (因为在/2的时候基数会损失一个 9/2=4)

难度 ※※※※

数据结构 array, linked list, red-black tree

算法 sort, merge

思路

arraylist 转数组,先写comparator给数组排序,按start比。

排序好后弄一个 prev=0位 然后 和从1遍历的curr比

如果curr.start>=prev.end 说明有 interval那时候只要在比较prev.end和curr.end 那个end 大就更新prev.edm

如果 curr.start

难度 ※※※※

数据结构 array, linked list, red-black tree

算法 sort, merge

思路 把要插入的add到linked list后 再sort。。然后接下去和上一题完全一样

难度 ※※※※※

数据结构 string

算法 math

思路

如果遍历中有些东西如果有一次就够了可以立个boolean的flag

注意. Arrays.toString(char) 会返回带括号和逗号的数组形式的string 所以要,而不是一个正常string 所以要s = new String(temp);

如果实在做不出 try{ Double.valueOf(s); return true;}catch (Exception e){ return false; }

正则做法 Pattern p = Pattern.compile("^[\+\-]?((\d+(\.\d*)?)|(\.\d+))(e[\+\-]?\d+)?$");

难度 ※※※※※

算法 dp

思路

Dynamic Programming, 先确定初始问题, 在递推 recursion解决后面的子问题

if (n >= 3) { ways= climbStairs(n - 1) + climbStairs(n - 2);}

但是这么写会超时.所以用iterator 的方法 复杂度变为0(n)

for(int i=3;i<=n;i++){

n3=n1+n2; // 本质还是f(n)=f(n-1)+f(n-2)

n1=n2; //每当i++时候

n2=n3; //n1=上一次的n2 n2等于上一次的n3

}

难度 ※※※

数据结构 array

思路 这题和CC150上1_7类似 但是cc 150的解法是用了 rows 和columns2个数组来储存0的坐标,比如matrix[i][j]=0 columns[i]++ rows[j]++,然后再次遍历这个matrix,当if(columns[i]!=0||rows[j]!=0)这个matrix[i][j]=0, leetcode上要求不需求辅助空间 那么我们就把matrix的第0行和第0列当做columns[] rows[] 来存0.先检查第0行和第0列 然后在检查从下标1开始的行和列 然后处理下标1开始的行和列,最后再处理第0行和第0列

难度 ※※

数据结构 array

算法 two pointers, merge

思路

A,B不是都sorted了吗,我们不从头开始比谁小,我们从A,B的尾巴开始比谁大

谁大,谁就放到A的[(a最后一个有数据的下标)+(b.length)],然后该--下标的--,接下去就和普通mergesort一样(不要忘记检查2个数组是否为空 比方说 A空B有的时候就把B一个一个赋值到A里)

难度 ※※※

数据结构 tree

算法 dfs

思路 即如果一棵二叉树是BST,那么它的中序遍历是一个递增的数组。所以可以对中序遍历算法稍加修改,

static int lastVisit=Integer.MIN_VALUE;

public boolean isValidBST(TreeNode root) {

if(root==null){ return true;}

if(!isValidBST(root.left)){return false;}//从左子树最左节点开始

if(root.val<=lastVisit){return false;}

lastVisit=root.val;//中间结点

if(!isValidBST(root.right)){return false;}//右子树最左开始

return true;

}

难度 ※※

数据结构 string

算法 two pointers

思路 2个指针从头++尾巴--开始对比,然后要处理非字母和数字的字符 可以先tolowercase 然后 ((temp.charAt(start) >= '0' && temp.charAt(start) <= '9') || (temp

.charAt(start) >= 'a' && temp.charAt(start) <= 'z'))

难度 ※※※

数据结构 graph

算法 bfs, shortest path

思路 因为每次只能在词里改一个字母,我们先把start放到一个queue里(可以用linkedlist实现 然后另外一个linkedlist存Integer的distance)然后只要queue里还有词。我们把词取出来,从首字母for循环遍历到尾巴字母,里面再一个循环 每个字母(char temp='a';temp<='z';temp++) 从A遍历到Z 然后再转回string看看字典里有没有,字典里面有再放入word的那个的queue 以此循环 直到==end 或者wordqueue空了返回0

frequency4

刷题总结

chapter01 基础编程面试总结

面试考察的编程基本功

程序风格(缩进,括号,变量名)

Coding习惯(异常检查,边界处理)

沟通(让面试官时刻明白你的意图)

测试(主动写出合理的Testcase)

算法其实很简单

在刷题时,总结、归类相似题目

找出适合同一类题目的模板程序

排列组合模板

chapter02 binary search & sorted array

这一部分都可以使用bs模板来解决问题 二分搜索模板

算法面试中如果需要优化O(n)的时间复杂度,那么只能是O(logn)的二分法

二分搜索四点要素:

start + 1 < end

start + (end - start) / 2

A[mid] ==,

A[start] A[end] ? target

总结

Binary Search Template (4 key points)

Rotated Sorted Array

Find Minimum

Find Target

why o(n) with duplicates ?

Find Median in Two Sorted Array find kth

Reverse in 3 steps

chapter03 Binary Tree & Divide Conquer & DFS/BFS

任何二叉树的问题都可以尝试使用分治法解决

二叉树的遍历问题,递归转为非递归的写法都是使用人工栈模拟系统栈的方式

宽度优先遍历的方法

2 Queues

1 Queues + Dummy Node

1 Queues(best)

chapter04 permutation & subset

排列组合问题总结

Arrays.sort 去重

result.add 什么时候输出结果

if(condition) continue 什么情况跳过

回溯,关键是在递归完了,需要还原items的状态

排列组合适用题目

word break ii

palindrome partition

path sum ii

restore ip address

subsets ii

subsets

combinations

permutations ii

permutation

combination sum ii

substring with concatenation of all words

letter combination of a phone number

chapter05 linked list

需要掌握的技能

insert a node in sorted list

remove a node from linked list

reverse a linked list

merge two linked list

find the middle of a linked list

Dummy Node

remove duplicates from sorted list i,ii

merge two sorted lists

partition list

reverse linked list ii

**Two Pointer **

chapter06 dynamic programming

DP的本质就是 记忆化搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值