leetcode刷题
yyxyuxueYang
这个作者很懒,什么都没留下…
展开
-
剑指offer 35 复杂链表的复制 (java)
剑指offer 35 复杂链表的复制题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析: 即原链表对应的每个节点都要新建一遍,且要保证指针的指向.方法1原地复制,再拆分链表将原链表的每个节点都复制一遍,且复制的节点紧随原来的节点。全部复制完毕,再断开与原链表的链接。图片来自Markus)impor原创 2020-06-06 22:59:32 · 199 阅读 · 0 评论 -
剑指offer 矩形覆盖(java)
矩形覆盖我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:解题思路:参考struggle201907102230352 public class Solution { public int RectCover(int target) { //f(n) = f(n-1)+ f(n-2) if(target == 0) return 0;原创 2020-06-01 17:02:37 · 165 阅读 · 0 评论 -
剑指offer 矩形覆盖(java)
矩形覆盖我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:解题思路:参考struggle201907102230352 public class Solution { public int RectCover(int target) { //f(n) = f(n-1)+ f(n-2) if(target == 0) return 0;原创 2020-06-01 15:23:18 · 125 阅读 · 0 评论 -
剑指offer 03二维数组的查找(java)
解题思路从数组右上角(左下角)开始遍历;当target小于当前值,说明target在当前左边区域,删除当前值所在的列;大于当前值,说明target在当前值下方,删除其所在的行;等于当前值,直接返回true;循坏完毕未找到,返回false;Java Solutionclass Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { // n次提交代码心得:matrix为nu原创 2020-06-01 14:03:00 · 123 阅读 · 0 评论 -
剑指offer 05 替换空格(java)
替换空格题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。注意输入类型,输入的str为StringBuffer,相关操作有设置长度,setCharAt()等,随后需要调用toString()返回。方法一直接在原数组上替换 :时间O(N)空间O(1)public class Solution{ public String replaceSpace(StringBuffer原创 2020-06-01 14:01:19 · 167 阅读 · 0 评论 -
剑指offer 06 从尾到头打印链表(java)
从尾到头打印链表题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。方法1采用stack实现逆序~import java.util.Stack;/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/impo原创 2020-06-01 13:58:59 · 206 阅读 · 0 评论 -
剑指offer 09 用两个栈实现队列(java)
用两个栈实现队列一个用于进队,一个用于出队。stack1负责所有元素依次入队, stack2负责出队顺序,将stack1中的元素依次push到stack2中时,已经实现元素相对顺序逆转,1)当stack2不为空时,出队就出stack2中的元素,当stack2中为空时,需要将stack1中的元素全部入stack2!import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<I原创 2020-06-01 13:56:55 · 118 阅读 · 0 评论 -
剑指offer 12 矩阵中的路径(java)
面试题12. 矩阵中的路径题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第原创 2020-05-27 11:07:13 · 156 阅读 · 0 评论 -
剑值offer 36 二叉搜索树与双向链表(java)
面试题36 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题解题目要求排序的双向链表,则:采用中序遍历,刚好节点的值为一个递增的序列。双向链表: 则链表中相邻的两个节点之间(如果驱节点 pre ,当前节点 cur)有则 pre.right = cur, cur.left = pre算法流程采用非递归的中序dfs,用一个栈记录访问次序,一个辅助链表记录访问结果,在辅助链表中修改指针指向。返回辅助原创 2020-05-26 20:10:12 · 89 阅读 · 0 评论 -
十大排序算法(快排、归并等)
包含快速排序归并排序package sort;public class SortAlgorithm { /* 快速排序 */ public void quickSort(int[] arr, int low, int high){ if(low >= high) return ; // 数组只剩一个元素,不用再排序; // 每次排序设置一个基准点,低于基准点的数放在基准点右边,高于基准点的数放在基准点左边;原创 2020-05-26 16:44:57 · 211 阅读 · 0 评论 -
剑指offer 62_二叉搜索树的第k个结点(java)
二叉搜索树的第k个结点思路采用中序遍历,天然的就是升序,则找到中序遍历的第k个节点就行~~~写法1 – 递归/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/// 考虑二叉搜索数的性质,中序遍历的结果就是升序的,那么遍历到原创 2020-05-26 16:32:23 · 217 阅读 · 0 评论 -
剑指offer 58_翻转单词顺序(java)
面试题58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。方法1. 两次翻转import java.lang.StringBuilder;public class Solution { public String ReverseSentence(String str) { // " "?首位如果时空格怎原创 2020-05-26 16:31:16 · 184 阅读 · 0 评论 -
剑指offer 58_左旋转字符串(java)
面试题58 - II. 左旋转字符串注意考虑完全,比如n越界, 字符串长度等问题~~~public class Solution { public String LeftRotateString(String str,int n) { // 考点是 n的范围!!!! if(n <= 0 || str.length()<=1) return str; int n1 = n % str.length(); return原创 2020-05-26 16:30:16 · 147 阅读 · 0 评论 -
剑指offer 57_和为s的连续正数序列(java)
面试题57 - II. 和为s的连续正数序列思路: 滑动窗口import java.util.ArrayList;import java.util.Arrays;public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { int i = 1; int j = 1; int s = 0;原创 2020-05-26 16:26:42 · 151 阅读 · 0 评论 -
剑指offerr 56只出现一次的数字_系列(java)
只出现一次的数字系列异或的性质两个数字异或的结果a^b是将 a 和 b 的二进制每一位进行运算,得出的数字。 运算的逻辑是如果同一位的数字相同则为 0,不同则为 1异或的规律任何数和本身异或则为 0任何数和 0 异或是 本身异或满足交换律。 即 a ^ b ^ c ,等价于 a ^ c ^ b136. 只出现一次的数字 1给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。class Solution {原创 2020-05-26 16:25:42 · 166 阅读 · 0 评论 -
剑指offer 55_平衡二叉树(java)
平衡二叉树-II输入一棵二叉树,判断该二叉树是否是平衡二叉树(它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1)。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树方法1:自顶向下思路分析:从根节点出发开始递归,依次判断左右子树的深度差是否<1,同时还要判断当前的左右子树是否平衡;递归条件:左右子树深度差<1且左右子树均为平衡树;终止条件:上述的非命题复杂度时间复杂度:O(NlogN) 每层节点的求深度操作O(N)*树的深度遍历O(logN)空间复杂度:O(原创 2020-05-26 16:24:10 · 182 阅读 · 0 评论 -
剑指offer 55_二叉树的深度(java)
面试题55 - I. 二叉树的深度思路: 递归找左右子树的深度。树的遍历深度优先dfs: 包括前序、中序、 后序。(一般对应递归的顺序)广度优先bfs: 层序遍历其中dfs方法:树的后序遍历 / 深度优先搜索往往利用 递归 或 栈 实现,本文使用递归实现。观察到: 二叉树的深度 = max(左子树的最大深度,右子树的最大深度)+ 1;##方法一 dfsdfs算法流程终止条件: 当 root 为空,说明已越过叶节点,因此返回 深度 00 。递推工作: 本质上是对树做后序原创 2020-05-26 16:21:35 · 134 阅读 · 0 评论 -
剑指offer 53_在排序数组中查找数字(java)
面试题53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。考察如何优化 查找算法!思路 二分查找采用二分查找, 找出目标元素地左右边界。时间 O(NlogN)public class Solution { public int GetNumberOfK(int [] array , int k) { // 二分查找 给定元素的左右边界: 结果等于 (high - low +1) if(array.length <=0) r原创 2020-05-26 16:20:29 · 162 阅读 · 0 评论 -
简直offer 52_两个链表的第一个公共节点(java)
面试题52. 两个链表的第一个公共节点输入两个链表,找出它们的第一个公共结点。注意,返回的是公共节点!!!, 不是第一个节点值相同的节点~~思路 双指针–相遇使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。这样,当它们相遇时,所指向的结点就是第一个公共结点。pu原创 2020-05-26 16:18:34 · 154 阅读 · 0 评论 -
剑指offer 51_数组中的逆序对(java)
面试题51. 数组中的逆序对思路一 暴力法会超出时间限制!! 牛客中只能AC 50%public class Solution { public int InversePairs(int [] array) { int count = 0; for(int i = 0; i < array.length; i++){ for(int j = i+1; j < array.length; j++){原创 2020-05-26 16:17:28 · 128 阅读 · 0 评论 -
剑指offer 50_第一个只出现一次的字符(java)
面试题50. 第一个只出现一次的字符在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)思路一: 暴力法:时间: O(N^2)空间:O(N)public class Solution { public int FirstNotRepeatingChar(String str) { // 暴力法 int[] ans = new in原创 2020-05-26 16:16:38 · 131 阅读 · 0 评论 -
剑指49_丑数(java)
面试题49. 丑数我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数思路动态规划!!byKrahets丑数的递推性质: 丑数只包含因子 2, 3, 5 ,因此有 “丑数 == 某较小丑数 × 某因子” (例如:10 = 5×2)。设已知长度为 n 的丑数序列 x1, x2, …x_n。则 Xn+1 =原创 2020-05-26 16:15:35 · 155 阅读 · 0 评论 -
j剑指offer43_1~n整数中1出现的次数(java)
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。。思路1: 暴力穷举;从n开始, 统计n包含的1的个数,再统计n-1, n-2…1,每一个数字包含的1的个数;求和即可*时间: O(N^2) 在leetcode上会超时,在牛客网能通过~~public class Solution { public int NumberOf1Between1AndN_Solution(int原创 2020-05-26 16:13:11 · 188 阅读 · 0 评论 -
剑指offer42_连续子数组的最大和(java)
思路一: 贪心法用sum记录从前往后扫过的最大的连续子数组的和;用curSum记录某元素前面紧挨的数组的和;如果curSum小于0;说明该元素前面的子数组的和,都结果有负影响,将curSum更新为nums[i];4)如果curSum大于0,就把curSum更新为 curSum+nums[i];判断全局的Sum和curSum大小,更新全局的Sum;时间复杂度 O(n)class Solution { public int maxSubArray(int[] nums原创 2020-05-26 16:11:28 · 245 阅读 · 2 评论 -
剑指offer40_最小的k个数-(java) 多解法
面试题40. 最小的k个数注意leetcode和牛客网的区别!!!! 返回值的类型不一致;题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路1 — 直接调用排序算法!!!Array.sort(int[] a);其实现也是快速排序~import java.util.ArrayList;import java.util.Arrays;public class Solution { // 注意 牛客网中该题是返原创 2020-05-26 16:10:02 · 162 阅读 · 0 评论 -
剑指offer37_序列化二叉树(java)
37 序列化二叉树题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"原创 2020-05-26 16:06:51 · 147 阅读 · 0 评论 -
剑指offer33_二叉搜索树的后序遍历序列(java)
二叉搜索树的后序遍历序列递归地判断左右区间是否满足二叉搜索树的特征.public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence == null || sequence.length == 0) return false; return help(sequence, 0, sequence.length-1); } // 划原创 2020-05-26 16:05:40 · 121 阅读 · 0 评论 -
剑指offer 34_二叉树中和为某一值的路径(java)
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题策略先序dfs+回溯法 + 递归解题思路参考Krahets算法流程FindPath(TreeNode root,int target)函数参数:待判断的树,给定的和;返回值: 返回所有路径help(TreeNode root, int tar)递归参数: 当前节点 root ,当前目标值 tar。递归终止条件:若节点原创 2020-05-26 11:29:09 · 177 阅读 · 0 评论