leecode148+剑指offer
找工作必刷经典算法题
全国各地
这个作者很懒,什么都没留下…
展开
-
简化绝对路径
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符..原创 2020-06-21 10:57:38 · 323 阅读 · 0 评论 -
链表:将两个有序的链表合并为一个新链表
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。法一:递归T(m+n)解题思路:1.终止条件:l1为空,返回l2,l2为空,返回l12.返回值:每一层调用都返回排序好的链表头3.本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理O(m+n),m 为 l1的长度,n 为 l2 的长度class Solution { public ListNode mergeTwoLists(List原创 2020-06-21 09:32:14 · 1327 阅读 · 0 评论 -
m*n的矩阵,有一个元素是0,把该元素所在的行和列上的元素全置为0
给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法。拓展:你的算法有使用额外的空间吗?一种比较直接的算法是利用O(m,n)的空间,但是这不是一个好的解法使用简单的改进可以在O(m+n)的空间解决这个问题,但是还不是最佳的解法你能在常量级的空间复杂度内解决这个问题吗?输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]...原创 2020-06-20 20:35:03 · 1149 阅读 · 0 评论 -
数组:在m*n矩阵中判断目标值是否存在的算法
请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征:每一行的数字都从左到右排序每一行的第一个数字都比上一行最后一个数字大例如:输入:matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]]target = 3输出: true解题思路:1.二维数组的行数,列数2.可以将其展成为一个有序数组,采用二分法import java.util.*;publi...原创 2020-06-20 13:05:46 · 1228 阅读 · 0 评论 -
删除给出链表/数组中的重复元素
删除给出链表中的重复元素1删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次例如:给出的链表为1->1->2,返回1->2.给出的链表为1->1->2->3->3,返回1->2->3.解题思路:1.先判空2.如果当前节点和当前节点下一个节点不为空情况一:当前节点和当前节点下一个节点值相等,改变指针cur.next=cur.next.next;情况二:继续如期遍历import jav原创 2020-06-19 11:22:58 · 608 阅读 · 0 评论 -
数组:搜索旋转排序数组
搜索旋转排序数组1假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4...原创 2020-06-19 09:36:01 · 515 阅读 · 0 评论 -
分割链表:链表小于x在前,大于等于x在后
给出一个链表和一个值x,以x为参照将链表划分成两部分,使所有小于x的节点都位于大于或等于x的节点之前。两个部分之内的节点之间要保持的原始相对顺序。例如:给出1->4->3->2->5->2和x = 3,返回1->2->2->4->3->5.解题思想:1.建立带头结点的小链表和大链表2.比x小的节点放到before_head链表中3.比x大的节点放到after_head链表中4.将小链表和大链表连起来5.返回小原创 2020-06-05 20:26:17 · 941 阅读 · 1 评论 -
将两个有序数组合并到一起
给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组注意:可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n暴力:t((n+m)*log(m+n)) s(1)System.arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组起始位置, 复制的长度); 方法实现复制:解题思路;1.将B复制到A后面2.整体排序(没有用到A,B有序的条件)import java.util.*;public class S..原创 2020-06-05 19:55:50 · 587 阅读 · 0 评论 -
反转一个列表/从头/指定区间
反转一个链表解题思路:1.定义当前遍历节点cur,cur的前驱节点pre,cur的后继的节点next2.初始化cur=head,pre=null,next=cur.next3.遍历cur不空时,逆置链表迭代/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x;原创 2020-06-04 23:25:30 · 310 阅读 · 0 评论 -
栈:中序遍历
给出一棵二叉树,返回这棵树的中序遍历//递归,o(n)t(n)解题思路:1.根节点不空时,2.左子树不空,遍历左子树3.根节点值加入到结果中4.右子树不空,遍历右子树import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution {原创 2020-06-04 17:30:53 · 1611 阅读 · 0 评论 -
树:构建BST,返回个数/序列
给定一个值n,能构建出多少不同的值包含1...n的二叉搜索树(BST)?给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 /...原创 2020-06-03 15:26:57 · 366 阅读 · 0 评论 -
树:判断是否是BST二叉搜索树
判断给出的二叉树是否是一个二叉搜索树(BST)二叉搜索树的定义如下一个节点的左子树上节点的值都小于自身的节点值一个节点的右子树上节点的值都小于自身的节点值所有节点的左右子树都必须是二叉搜索树递归解题思路:1.find(root, low, up) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r) 的范围内说明不满足条件,return false.2.递归调原创 2020-06-02 16:50:38 · 313 阅读 · 0 评论 -
错误交换两个节点,恢复BST二叉搜索树
二叉搜索树(BST)中的两个节点被错误地交换了, 请在不改变树的结构的情况下恢复这棵树。解题思路:1.先找出左子树最大的节点,右子树最小的节点2.情况1:左子树根节点交换3.情况2:右子树根节点交换4.情况3:左子树大于右子树5.情况4:左子树两个节点交换6.情况5:右子树两个节点交换import java.util.*;/** * Definition for binary tree * public class TreeNode { * int v.原创 2020-06-02 16:09:50 · 809 阅读 · 0 评论 -
树:判断两个二叉树是否相等/对称(镜像)
给出两个二叉树,请写出一个判断两个二叉树是否相等的函数。判断两个二叉树相等的条件是:两个二叉树的结构相同,并且相同的节点上具有相同的值。解题思路:1.如果两个都是空树,返回真2.如果有一棵是空树,返回假3.如果对应结点值不同,返回假4.递归左右子树import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right.原创 2020-06-01 14:11:00 · 421 阅读 · 0 评论 -
二叉树层次遍历:由顶层向底/由底层到顶层/z型
给定一个二叉树,返回该二叉树由底层到顶层的层序遍历,(从左向右,从叶子节点到根节点,一层一层的遍历)思路分析:1.定义一个队列,根节点入队,判断左右子树2.sublist存放同一层结点的值3.list存放所有层节点的值4. Collections.reverse()倒置Offerfirst():将指定的元素插入LinkedList的开头。失败返回false,import java.util.*;/* * public class TreeNode { * int v原创 2020-05-31 20:48:52 · 481 阅读 · 0 评论 -
树:前/后序遍历和中序遍历,构造二叉树
给出一棵树的前序遍历和中序遍历,请构造这颗二叉树注意:可以假设树中不存在重复的节点思路分析:1.定义一个hash映射,便于定位根节点2.遍历中序,定位中序节点位置3.递归遍历左子树:先序遍历中「 从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素4.递归遍历右子树:先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素impor原创 2020-05-31 17:40:05 · 391 阅读 · 0 评论 -
将升序单链表/数组转换为平衡二叉树BST
给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)递归:o(nlogn)解题思路:1.找到链表的中点mid,2.记录mid前缀,断开链表3.将mid放入到树中4.递归head(左链表),mid.next(右链表)import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = nul.原创 2020-05-29 17:30:17 · 888 阅读 · 0 评论 -
路径求和
path-sum 1给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径,给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节...原创 2020-05-28 22:08:45 · 386 阅读 · 0 评论 -
树:填充每个节点的右侧节点指针 populating-next-right-pointers-in-each-node-ii
填充每个节点的右侧节点指针1给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下示例,所有 next 指针都被设置为 NULL。思路1:广度优先遍历...原创 2020-05-27 17:38:03 · 190 阅读 · 0 评论 -
杨辉三角
输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1],[1,4,6,4,1]]import java.util.*;public class Solution { /** * * @param numRows int整型 * @return int整型ArrayList<ArrayList<>> */ public ArrayList<...原创 2020-05-26 15:59:45 · 122 阅读 · 0 评论 -
数组:best-time-to-buy-and-sell-stock ,最佳时间买股票
买卖股票最佳时刻给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。暴原创 2020-05-25 21:05:32 · 135 阅读 · 0 评论 -
树:判断是否平衡二叉树
判断给定的二叉树是否是平衡的在这个问题中,定义平衡二叉树为每个节点的左右两个子树高度差的绝对值不超过1的二叉树import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNo原创 2020-05-25 00:34:52 · 94 阅读 · 0 评论 -
树:求给定二叉树的最大深度
求给定二叉树的最大深度,最大深度是指树的根结点到叶子结点import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNode类 * @return int整型原创 2020-05-25 00:11:38 · 326 阅读 · 1 评论 -
递归:判断回文
判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写例如:"A man, a plan, a canal: Panama"是回文"race a car"不是回文注意:你有没有考虑过字符串可能为空?这是面试时应该提出的一个好问题。针对这个问题,我们定义空字符串是回文import java.util.*;public class Solution { /** * * @param s string字符串 * @ret原创 2020-05-24 23:54:51 · 550 阅读 · 0 评论 -
树:非空二叉树,返回其最大路径和
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7输出: 4...原创 2020-05-23 18:42:57 · 865 阅读 · 0 评论 -
数组:无序的整数类型数组,求最长的连续元素序列的长度。
给定一个无序的整数类型数组,求最长的连续元素序列的长度。例如:给出的数组为[100, 4, 200, 1, 3, 2],最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4你需要给出时间复杂度在O(n)之内的算法给定一个无序的整数类型数组,求最长的连续元素序列的长度。例如:给出的数组为[100, 4, 200, 1, 3, 2],最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4你需要给出时间复杂度在O(n)之内的算法//暴力算法原创 2020-05-23 17:59:14 · 1794 阅读 · 0 评论 -
树:129. 求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 ...原创 2020-05-22 21:40:51 · 120 阅读 · 0 评论 -
数组:围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两.原创 2020-05-22 19:45:52 · 155 阅读 · 0 评论 -
图:1.复制无向图
本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表我们无向图用以下的方法序列化:节点的标签是互不相同的,我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.这个无向图一共有3个节点,因此序列被#分隔成三部分第一个节点的标签是0,节点0和节点1,节点2之间有边第二个节点的标签是1,节点1和节点2之间有边第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环原创 2020-05-21 15:10:50 · 249 阅读 · 1 评论 -
贪心:1.从哪个加油站出发可以在环形路上走一圈
环形路上有n个加油站,第i个加油站的汽油量是gas[i].你有一辆车,车的油箱可以无限装汽油。从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时候油箱里面没有汽油。求从哪个加油站出发可以在环形路上走一圈。返回加油站的下标,如果没有答案的话返回-1。注意:答案保证唯一import java.util.*;public class Solution { /** * * @param gas int整型一维数组原创 2020-05-21 12:35:51 · 257 阅读 · 0 评论 -
字符串:1.给定一个字符串s,分割s使得s的每一个子串都是回文串
给定一个字符串s,分割s使得s的每一个子串都是回文串返回所有的回文分割结果。(注意:返回结果的顺序需要和输入字符串中的字母顺序一致。)例如:给定字符串s="aab",返回 [↵ ["aa","b"],↵ ["a","a","b"]↵ ]import java.util.ArrayList;import java.util.List;public class Solution { /** * * @param s string字符串 ...原创 2020-05-20 16:56:11 · 3235 阅读 · 0 评论 -
位运算:1.single number,找出数组中出现一位的数字
基础知识:任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a任何数和其自身做异或运算,结果是 0,即 a⊕a=0异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b使用位运算符可以实现 O(1) 的空间复杂度。异或运算:x ^ 0 = x , x ^ 1 = ~x与运算:x & 0 = 0 , x & 1 = xsinggle number1:整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现2次。你需要找出只出原创 2020-05-20 14:45:50 · 278 阅读 · 0 评论 -
链表:6.链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。 请对这个链表进行深拷贝。
回溯该方法通不过所有的测试用例/** * Definition for singly-linked list with a random pointer. * class RandomListNode { * int label; * RandomListNode next, random; * RandomListNode(int x) { this.label = x; } * }; */import java.util.HashMap;public原创 2020-05-19 21:13:39 · 383 阅读 · 0 评论 -
栈:1.逆波兰式(后缀表达式)的值
基础知识:栈stackpush( num) //入栈pop() //栈顶元素出栈empty() //判定栈是否为空peek() //获取栈顶元素search(num) //判端元素num是否在栈中,如果在返回1,不在返回-1 从队列首部插入 从队列首部取出 从队列尾部插入 从队列尾部取出 失败抛出异常(栈)...原创 2020-05-16 17:34:20 · 154 阅读 · 0 评论 -
枚举:1.对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
/** * Definition for a point. * class Point { * int x; * int y; * Point() { x = 0; y = 0; } * Point(int a, int b) { x = a; y = b; } * } */public class Solution { public int maxPoints(Point[] points) { //如果点的数目少于3 个,一定连.原创 2020-05-16 21:15:55 · 241 阅读 · 0 评论 -
树:3.求给定的二叉树的前序遍历
前序遍历:根左右import java.util.Stack;import java.util.ArrayList;/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2020-05-18 14:25:35 · 344 阅读 · 0 评论 -
树:2.求给定的二叉树的后序遍历
递归import java.util.ArrayList;/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { public ArrayList<Integer.原创 2020-05-17 22:23:55 · 249 阅读 · 0 评论 -
树:1.求给定二叉树的最小深度
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *///深度遍历优先(DFS)递归/栈public class Solution { public int run(TreeNode root) { if.原创 2020-05-16 13:29:32 · 87 阅读 · 0 评论 -
链表:5.判断给定的链表中是否有环
判断给定的链表中是否有环扩展:你能给出不利用额外空间的解法么?/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { pub原创 2020-05-18 17:34:04 · 159 阅读 · 0 评论 -
链表:4.判断是否有环
对于一个给定的链表,返回环的入口节点,如果没有环,返回null拓展:你能给出不利用额外空间的解法么?/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class原创 2020-05-18 17:04:02 · 132 阅读 · 0 评论