![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法和数据结构
Melo丶
Javaer
展开
-
面试排序算法
Leetcode 912.排序数组公共交换函数private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp;}1. 选择排序每轮找出最小的值放在左侧private void selectionSort(int[] nums)...原创 2020-03-09 13:24:36 · 224 阅读 · 0 评论 -
《剑指Offer》68. 树中两个节点的最低公共祖先
题目链接68.1 二叉查找树题目链接Leetcode解题思路在二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeN...原创 2020-02-09 00:57:16 · 188 阅读 · 0 评论 -
《剑指Offer》67. 把字符串转换成整数
题目链接牛客网题目描述将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。Iuput:+21474836471a33Output:21474836470解题思路public class Solution { public int StrToInt(String str) { if (str==null...原创 2020-02-09 00:46:34 · 150 阅读 · 0 评论 -
《剑指Offer》66. 构建乘积数组
题目链接牛客网题目描述给定一个数组 A[0, 1,…, n-1],请构建一个数组 B[0, 1,…, n-1],其中 B 中的元素 B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。要求不能使用除法。解题思路import java.util.ArrayList;public class Solution { public int[] multiply(i...原创 2020-02-09 00:20:45 · 159 阅读 · 0 评论 -
《剑指Offer》65. 不用加减乘除做加法
题目链接牛客网题目描述写一个函数,求两个整数之和,要求不得使用 +、-、*、/ 四则运算符号。解题思路a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。public clas...原创 2020-02-08 23:19:52 · 133 阅读 · 0 评论 -
《剑指Offer》64. 求 1+2+3+...+n
题目链接牛客网题目描述要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 A ? B : C。解题思路使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后...原创 2020-02-08 19:30:43 · 122 阅读 · 0 评论 -
《剑指Offer》63. 股票的最大利润
题目链接Leetcode题目描述可以有一次买入和一次卖出,买入必须在前。求最大收益。解题思路使用贪心策略,假设第 i 轮进行卖出操作,买入操作价格应该在 i 之前并且价格最低。class Solution { public int maxProfit(int[] prices) { if (prices==null || prices.length==0) r...原创 2020-02-08 19:26:53 · 137 阅读 · 0 评论 -
《剑指Offer》62. 圆圈中最后剩下的数
题目链接牛客网题目描述让小朋友们围成一个大圈。然后,随机指定一个数 m,让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0…m-1 报数 … 这样下去 … 直到剩下最后一个小朋友,可以不用表演。返回最后小朋友的编号解题思路约瑟夫环,圆圈长度为 n 的解可以看成长度为 n-1 的...原创 2020-02-08 19:24:01 · 118 阅读 · 0 评论 -
《剑指Offer》61. 扑克牌顺子
题目链接牛客网题目描述五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。解题思路import java.util.*;public class Solution { public boolean isContinuous(int [] nums) { if (nums==null || nums.length<5) return fals...原创 2020-02-08 16:57:07 · 149 阅读 · 0 评论 -
《剑指Offer》60. n 个骰子的点数
题目链接Lintcode题目描述把 n 个骰子扔在地上,求点数和为 s 的概率。解题思路动态规划,dp[i][j]表示第i个骰子得到j点数的总次数public class Solution { /** * @param n an integer * @return a list of Map.Entry<sum, probability> ...原创 2020-02-08 16:44:44 · 208 阅读 · 0 评论 -
《剑指Offer》59. 滑动窗口的最大值
题目链接牛客网题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组 {2, 3, 4, 2, 6, 2, 5, 1} 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,他们的最大值分别为 {4, 4, 6, 6, 6, 5}。解题思路PriorityQueue.remove(Object O)可以删除堆中的指定元素,只要维持堆的大小在size就可以...原创 2020-02-08 14:21:49 · 151 阅读 · 0 评论 -
《剑指Offer》58.2 左旋转字符串
题目链接牛客网题目描述Input:S="abcXYZdef"K=3Output:"XYZdefabc"解题思路先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”。public class Solution { public String LeftRotateString(String s...原创 2020-02-08 13:36:44 · 150 阅读 · 0 评论 -
《剑指Offer》58.1 翻转单词顺序列
题目链接牛客网题目描述Input:"I am a student."Output:"student. a am I"解题思路题目应该有一个隐含条件,就是不能用额外的空间。虽然 Java 的题目输入参数为 String 类型,需要先创建一个字符数组使得空间复杂度为 O(N),但是正确的参数类型应该和原书一样,为字符数组,并且只能使用该字符数组的空间。任何使用了额外空间的解法在面试...原创 2020-02-08 12:50:47 · 127 阅读 · 0 评论 -
《剑指Offer》57.2 和为 S 的连续正数序列
题目链接牛客网题目描述输出所有和为 S 的连续正数序列。例如和为 100 的连续序列有:[9, 10, 11, 12, 13, 14, 15, 16][18, 19, 20, 21, 22]。解题思路双指针法,小了就h++,大了就l++,相等后添加进res,然后h++import java.util.ArrayList;public class Solution { p...原创 2020-02-08 11:39:45 · 171 阅读 · 0 评论 -
《剑指Offer》57.1 和为 S 的两个数字
题目链接牛客网题目描述输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。解题思路import java.util.*;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,i...原创 2020-02-08 00:03:50 · 145 阅读 · 0 评论 -
《剑指Offer》56. 数组中只出现一次的数字
题目链接牛客网题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数。解题思路原创 2020-02-07 23:10:07 · 162 阅读 · 0 评论 -
《剑指Offer》55.2 平衡二叉树
题目链接牛客网题目描述平衡二叉树左右子树高度差不超过 1。输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root==null) return true; return Math.a...原创 2020-02-07 22:07:49 · 98 阅读 · 0 评论 -
《剑指Offer》55.1 二叉树的深度
题目链接牛客网题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路public class Solution { public int TreeDepth(TreeNode root) { return root==null? 0: Math.max(TreeDepth(root...原创 2020-02-07 22:03:16 · 80 阅读 · 0 评论 -
《剑指Offer》54. 二叉查找树的第 K 个结点
题目链接牛客网题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路import java.util.*;public class Solution { private List<TreeNode> lst = new ArrayList<>(); p...原创 2020-02-07 21:54:56 · 108 阅读 · 0 评论 -
《剑指Offer》53. 数字在排序数组中出现的次数
题目链接牛客网题目描述统计一个数字在排序数组中出现的次数。Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4解题思路原创 2020-02-07 21:43:21 · 99 阅读 · 0 评论 -
《剑指Offer》52. 两个链表的第一个公共结点
题目链接牛客网题目描述解题思路设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能...原创 2020-02-07 20:53:12 · 98 阅读 · 0 评论 -
《剑指Offer》51. 数组中的逆序对
题目链接牛客网题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路就是在归并排序的时候做一点手脚,记录一下cnt数量public class Solution { private long cnt = 0; // 注意cnt是int可能越界 private int[] tmp; //...原创 2020-02-07 20:38:59 · 125 阅读 · 0 评论 -
《剑指Offer》50. 第一个只出现一次的字符位置
题目链接牛客网题目描述在一个字符串中找到第一个只出现一次的字符,并返回它的位置。Input: abaccOutput: b解题思路public class Solution { public int FirstNotRepeatingChar(String str) { if (str==null || str.length()==0) return -1;...原创 2020-02-06 21:01:34 · 101 阅读 · 0 评论 -
《剑指Offer》49. 丑数
题目链接牛客网题目描述把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。解题思路dp[i]表示第i+1个丑数public class Solution { public int GetUglyNumber_Solution(in...原创 2020-02-06 20:28:18 · 95 阅读 · 0 评论 -
《剑指Offer》48. 最长不含重复字符的子字符串
题目链接Leetcode题目描述输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。解题思路动态规划。首先定义dp[i]表示以第i个字符结尾的不包含重复字符的子字符串的最大长度。如果第i个字符从未出现过,那么dp[i] = dp[i-1] + 1;如果第i个字符之前出现过,我们需...原创 2020-02-06 18:34:54 · 144 阅读 · 0 评论 -
《剑指Offer》47. 礼物的最大价值
题目链接牛客网题目描述在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 812 2 9 65 7 4 113 7 16 5礼物的最大价值为 1+12+5+7...原创 2020-02-06 15:26:12 · 132 阅读 · 0 评论 -
《剑指Offer》46. 把数字翻译成字符串
题目链接Leetcode题目描述给定一个数字,按照如下规则翻译成字符串:1 翻译成“a”,2 翻译成“b”… 26 翻译成“z”。一个数字有多种翻译可能,例如 12258 一共有 5 种,分别是 abbeh,lbeh,aveh,abyh,lyh。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路动态规划,dp[i]表示到第i个字符为止的str有多少中可能class Solu...原创 2020-02-06 15:12:39 · 117 阅读 · 0 评论 -
《剑指Offer》45. 把数组排成最小的数
题目链接牛客网题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。解题思路可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在...原创 2020-02-06 14:17:30 · 222 阅读 · 0 评论 -
《剑指Offer》44. 数字序列中的某一位数字
题目链接无题目描述数字以 0123456789101112131415… 的格式序列化到一个字符串中,求这个字符串的第 index 位。第5位是5,第13位是1,第19位是4等等解题思路假设index = 1001序列的前10位是0~9这10个只有一位的数字,显然1001在这10个数字之后,因此这10个数字可以直接跳过,我们再从后面紧跟着的序列中找第991位的数字(1001-10 =...原创 2020-02-06 00:34:17 · 191 阅读 · 0 评论 -
《剑指Offer》43.从 1 到 n 整数中 1 出现的次数
题目链接牛客网题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路数学之美上面提出的方法,设定整数点(如1、10、1...原创 2020-02-05 22:29:45 · 102 阅读 · 0 评论 -
《剑指Offer》42. 连续子数组的最大和
题目链接牛客网题目描述{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。解题思路public class Solution { public int FindGreatestSumOfSubArray(int[] nums) { if (nums==null || nums.length==0...原创 2020-02-05 21:27:26 · 92 阅读 · 0 评论 -
《剑指Offer》41.2 字符流中第一个不重复的字符
题目链接牛客网题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 “go” 时,第一个只出现一次的字符是 “g”。当从该字符流中读出前六个字符“google" 时,第一个只出现一次的字符是 “l”。解题思路import java.util.Queue;import java.util.LinkedList;public class Sol...原创 2020-02-05 21:17:15 · 113 阅读 · 0 评论 -
《剑指Offer》41.1 数据流中的中位数
题目链接牛客网题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路import java.util.PriorityQueue;public...原创 2020-02-05 20:47:55 · 120 阅读 · 0 评论 -
《剑指Offer》40. 最小的 K 个数
题目链接牛客网题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路大小为 K 的最小堆复杂度:O(NlogK) + O(K)特别适合处理海量数据应该使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中的元素都是最小元素。维护一个大小为 K 的最小堆过程如下:在添加一...原创 2020-02-05 20:19:42 · 116 阅读 · 0 评论 -
《剑指Offer》39. 数组中出现次数超过一半的数字
题目链接牛客网题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。使用 c...原创 2020-02-05 20:10:41 · 128 阅读 · 0 评论 -
《剑指Offer》38. 字符串的排列
题目链接牛客网题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路回溯,需要记录哪个元素被访问过。与Leetcode47类似import java.ut...原创 2020-02-05 16:04:57 · 111 阅读 · 0 评论 -
《剑指Offer》37. 序列化二叉树
题目链接牛客网题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根...原创 2020-02-05 15:39:38 · 164 阅读 · 0 评论 -
《剑指Offer》36. 二叉搜索树与双向链表
题目链接牛客网题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路public class Solution { private TreeNode head = null, pre = null; public TreeNode Convert(TreeNode pRootOfTree) {...原创 2020-02-04 20:08:13 · 94 阅读 · 0 评论 -
《剑指Offer》35. 复杂链表的复制
题目链接牛客网题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; ...原创 2020-02-04 18:11:11 · 82 阅读 · 0 评论 -
《剑指Offer》34. 二叉树中和为某一值的路径
题目链接牛客网题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12解题思路回溯一定要每一个add都对应一个remove,尤其注意即使是正确路径public class Solution { public Ar...原创 2020-02-04 17:11:15 · 115 阅读 · 0 评论