
剑指offer
算法
MHY的CH
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树练习题02
99. 恢复二叉搜索树题目代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, T原创 2020-08-16 16:18:56 · 345 阅读 · 0 评论 -
树相关算法集合总结1
94. 二叉树的中序遍历题目代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */// 递归遍历方法一:// class Solution {// public List<Intege原创 2020-08-14 17:38:33 · 270 阅读 · 0 评论 -
面试题01[04、07]
面试题 01.04. 回文排列题目代码class Solution { public boolean canPermutePalindrome(String s) { // 使用两个long类型的数字,二进制64位来组成一个128的数组 // 疑问??字符串中的字符总共有128个么?? long highBmp = 0, lowBmp = 0; for (int i = 0; i < s.length(); i++) {原创 2020-08-11 17:42:58 · 222 阅读 · 0 评论 -
面试题01[01,02,03]
面试题 01.01. 判定字符是否唯一题目代码class Solution { public boolean isUnique(String astr) { // 使用set去重,之后返回size与string中的长度进行比较 // Set<Character> set=new HashSet<>(); // for(int i=0;i<astr.length();i++){ // set.原创 2020-08-10 18:11:24 · 204 阅读 · 0 评论 -
剑指offer[59-1,59-2,62]
剑指 Offer 59 - I. 滑动窗口的最大值题目思路使用队列维护一个窗口中的最大值,分为两个阶段,还未形成窗口时,以及形成窗口时(此时仅是窗口的右移,大小已经固定住);未形成窗口时:判断当前进来的值与队列尾部的值大小,对于比当前值小的队列中的数字清除形成窗口时:1.判断窗口弹出的数字是否为队列中队首(最大值),如果是则将队首删除,不是则无影响2.重复未形成窗口时的步骤,对新进来的值,将队列由右向左依次比较,队列中比当前值小的数字删除代码class Solution { pu原创 2020-08-06 15:43:13 · 212 阅读 · 0 评论 -
剑指offer[64,68-1,68-2]
剑指 Offer 64. 求1+2+…+n题目代码class Solution { int res=0; public int sumNums(int n) { // 使用逻辑运算符的短路属性;A&&B逻辑与:当A为false的时候,B的真假就不用判断,直接返回false // A||B 逻辑或:当A为真的时候,B的真假就不会计算,直接返回True的结果 // 使用递归进行加sum运算,使用逻辑运算符的短路属性判断是否终原创 2020-08-05 18:10:50 · 181 阅读 · 0 评论 -
剑指offer[57,57-2,58-1,58-2]
剑指 Offer 57. 和为s的两个数字题目思路使用二分法中的对撞指针,对于nums[i]+nums[j]和大于target情况,则j–;小于target时i++;当相等的时候,返回数组代码class Solution { public int[] twoSum(int[] nums, int target) { int i=0,j=nums.length-1; while(i<j){ //下面代码本来是想优化算法,但大部分时间还是原创 2020-08-05 16:01:21 · 140 阅读 · 0 评论 -
剑指offer[56-1,56-2,137]
剑指 Offer 56 - I. 数组中数字出现的次数题目代码class Solution { public int[] singleNumbers(int[] nums) { // 使用异或运算进行位运算,使用xor保存nums数组异或之后的二进制数 int xor=0; // 因为异或运算对于成对出现的数字异或结果为0,所以最终的xor为两个单独的数字异或结果, // 而且xor二进制中最后一位1表示两个单独数字在此位置不相原创 2020-08-04 18:45:50 · 151 阅读 · 0 评论 -
剑指offer[54,55-1,55-2]
剑指 Offer 54. 二叉搜索树的第k大节点题目代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int res,k; public int kt原创 2020-08-04 15:32:40 · 166 阅读 · 0 评论 -
剑指offer[52、53-1、53-2]
剑指 Offer 52. 两个链表的第一个公共节点题目思路代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution {原创 2020-08-04 10:51:56 · 190 阅读 · 0 评论 -
剑指offer[47、50]
剑指 Offer 47. 礼物的最大价值题目(动规题目)思路代码class Solution { public int maxValue(int[][] grid) { int a=grid.length,b=grid[0].length; int[][] dp=new int[a+1][b+1]; for(int i=1;i<dp.length;i++){ for(int j=1;j<dp[0].len原创 2020-08-03 11:58:30 · 164 阅读 · 0 评论 -
剑指offer[45、46]
剑指 Offer 45. 把数组排成最小的数题目思路快排+特殊规则;代码class Solution { public String minNumber(int[] nums) { String[] strs = new String[nums.length]; for(int i = 0; i < nums.length; i++) strs[i] = String.valueOf(nums[i]); fa原创 2020-08-01 23:49:44 · 134 阅读 · 1 评论 -
剑指offer[40、38、42]
剑指 Offer 40. 最小的k个数题目思路使用快排对数组排序,之后取出前K个数值,可优化(通过每次对K值进行比较与每一次快排的index序号进行比较,优化步骤)。也可以有其他更优解,后续会补充。代码class Solution { public int[] getLeastNumbers(int[] arr, int k) { // 使用快排返回前k个数值 // quikSort(arr,0,arr.length-1); // retu原创 2020-07-31 16:01:46 · 194 阅读 · 0 评论 -
剑指Offer[35、36、39]
剑指 Offer 35. 复杂链表的复制题目思路使用hashmap存储新老节点,简单思路就是两次遍历进行对新复制的链表赋值,也可以使用图遍历(复杂度更低,可优化)代码/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null;转载 2020-07-30 11:51:05 · 128 阅读 · 0 评论 -
剑指 Offer[33、34]
剑指 Offer 33. 二叉搜索树的后序遍历序列题目思路二叉搜索树定义: 左子树中所有节点的值 << 根节点的值;右子树中所有节点的值 >> 根节点的值;其左、右子树也分别为二叉搜索树。递归函数:输入:后序遍历数组,数组首部index,数组尾部index判断条件:i>=j是返回true以及代码中最终的tmp与j的数值判断功能:找出root节点,以及左子树和右子树,并对左右子树进行递归,判断左子树必须比root值小,右子树必须比root值大代码class S转载 2020-07-29 21:20:23 · 168 阅读 · 0 评论 -
剑指Offer[32,32-ii]
剑指 Offer 32 - I. 从上到下打印二叉树题目思路通过队列工具,将每一层的节点由左到右一次添加,当队列不为空的时候始终可以运行;代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */clas转载 2020-07-29 12:05:31 · 140 阅读 · 0 评论 -
剑指offer[31、49]
剑指 Offer 31. 栈的压入、弹出序列题目思路本题比较简单。借助一个栈对着push和pop数据执行,如果返回的栈为空,则说明可以顺利执行,否则不能通过。首先将push中的数组压入栈中,之后验证是否与pop数组中的数字相同,如果相同循环弹出栈(同时满足栈不为空),直到pop数组中的数字与栈顶不同,则继续将push数组中下一个数字循环上方操作。代码class Solution { public boolean validateStackSequences(int[] pushed,转载 2020-07-06 21:28:18 · 157 阅读 · 0 评论 -
剑指offer[29、30]
剑指 Offer 29. 顺时针打印矩阵题目思路通过可视化限制四个方向运动的边界线class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix.length == 0) return new int[0]; int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0; int[]转载 2020-07-06 15:38:27 · 168 阅读 · 0 评论 -
剑指offer[27、28]
剑指 Offer 27. 二叉树的镜像题目解题思路递归法:二叉树镜像定义: 对于二叉树中任意节点 root ,设其左 / 右子节点分别为 left, right ;则在二叉树的镜像中的对应 root 节点,其左 / 右子节点分别为 right, left。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode原创 2020-07-03 18:08:23 · 136 阅读 · 0 评论 -
剑指offer[25、26]
剑指 Offer 25. 合并两个排序的链表题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Lis转载 2020-06-30 19:33:55 · 166 阅读 · 0 评论 -
剑指offer[21、22、24]
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。思路使用双指针方法,将左右的错位数字交换位置,在交换之前判定i,j指向的数字均是错位数字(即为i指向偶数,j指向奇数时方可交换),否则挪动指针。判定结束条件为i<j;知识点: x&1 位运算原创 2020-06-20 15:10:17 · 143 阅读 · 0 评论 -
剑指offer[19]
面试题19 正则表达式匹配题目:请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。解法:class Solution { public boolean isMatch(String A, String B) { int a=A.length(转载 2020-05-15 18:29:18 · 120 阅读 · 0 评论 -
剑指offer[16、18]
面试题16 数值的整数次方题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。解法:class Solution { public double myPow(double x, int n) { if(x==0) return 0; double res=1; //Java 代码中 int32 变量 n \in [-2147483原创 2020-05-13 14:06:31 · 156 阅读 · 0 评论 -
剑指offer[14-1、14-2、15]
面试题14-1剪绳子题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]k[1]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18解法:思路一:暴力遍历+备忘录法减少运算量// 暴力解法+备忘录减少运算量class Solution { public int cuttingRope(i转载 2020-05-11 14:29:35 · 171 阅读 · 0 评论 -
剑指offer[11、12、13]
面试题11 旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。解法:思路一:遍历数组查询到反转点,时间复杂度未O(n),空间复杂度O(1);class Solution { public...转载 2020-05-08 16:09:41 · 108 阅读 · 0 评论 -
剑指offer[10-1.10-2]
面试题10-1 斐波那契数列题目:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初...转载 2020-05-06 18:38:20 · 244 阅读 · 0 评论 -
剑指offer [07 09]
面试题07 重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解析:递推参数: 前序遍历中根节点的索引pre_root、中序遍历左边界in_left、中序遍历右边界in_right终止条件: 当 in_left > in_right ,子树中序遍历为空,说明已经越过叶子节点,此时返回 nullnull ...转载 2020-05-06 13:30:16 · 98 阅读 · 0 评论 -
剑指offer[03,04,05,06]
面试题03 数组中重复的数字题目:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字解法://javaclass Solution { public int findRepeatNumber(int[] nums) { ...转载 2020-05-05 13:39:00 · 145 阅读 · 0 评论