剑指Offer
Mason97
这个作者很懒,什么都没留下…
展开
-
【牛客网】迷宫问题
采用搜索回溯的方法。import java.util.LinkedList;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int row = in.nextInt(); ...原创 2020-05-26 00:16:32 · 447 阅读 · 0 评论 -
39_剑指offer_ 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路一:public class Solution { public int majorityElement(int[] nums) { // 将数组排序,中间那个数一定是超过一半的 Arrays.sort(nums); int len原创 2020-05-09 10:36:28 · 106 阅读 · 0 评论 -
38_剑指offer_字符串的排列
思路一(bad idea)找出所有的排列,最后用set去重public class Solution { public String[] permutation(String s) { // “abc”举个例子 // 第一个字符可以是 a,b,c // 假设第一个是a,后边的可以是[b,c],[c,b] // 然后将第一个...原创 2020-05-06 09:59:28 · 105 阅读 · 0 评论 -
36_剑指offer_二叉搜索树与双向链表
思路是我创建一个方法,能够返回一个只有两个结点的数组,第一个结点是头,第二个结点是尾,已经完成了互联操作。我再将首尾进行连接就好了。public class Solution{ public Node treeToDoublyList(Node root) { if (root == null) return null; Node[] tmp = me...原创 2020-05-03 10:05:40 · 92 阅读 · 0 评论 -
35_剑指offer_ 复杂链表的复制
思路是建立hashMap,建立一一对应关系,这样就能实现 random的指针。public class Solution { public Node copyRandomList(Node head) { // 这是一个复杂的树结构 // 问题的关键是建立,新创建的树和之前树的一一对应关系 if (head == null) { ...原创 2020-05-02 09:29:41 · 115 阅读 · 0 评论 -
34_剑指offer_二叉树中和为某一值的路径
搜索回溯算法有个坑:res.add(new LinkedList<>(list));为什么要new呢,因为是引用类型。public class Solution { List<List<Integer>> res; public List<List<Integer>> pathSum(TreeNode root,...原创 2020-05-01 09:13:27 · 76 阅读 · 0 评论 -
33_剑指offer_二叉搜索树的后序遍历序列
充分利用二叉搜索树的性质。啥性质呢,根节点左边都小于根节点的值,根节点右边都大于根节点的值。思路:判断是不是如下的结构。如果是的话,继续判断左右子树是不是如下图的结构如果不是,直接返回false即可。public class Solution { public boolean verifyPostorder(int[] postorder) { // 判...原创 2020-04-30 10:41:49 · 109 阅读 · 0 评论 -
32_3_剑指offer_从上到下打印二叉树 III
思路一:层序遍历的变式,辅助一个栈从左到右采用层序遍历的思路,从右到左辅助一个栈。public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { // 之字形打印 if (root == null) { retu...原创 2020-04-29 08:39:03 · 96 阅读 · 0 评论 -
32_2_剑指offer_从上到下打印二叉树
思路:就是层序遍历嘛public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { // 就是层序遍历嘛 if (root == null) { LinkedList<List<Integer>&...原创 2020-04-28 08:22:30 · 84 阅读 · 0 评论 -
32_1_剑指offer_从上到下打印二叉树
思路,就是二叉树的层序遍历,辅助一个队列public class Solution { public int[] levelOrder(TreeNode root) { // 层序遍历 if (root == null) return new int[0]; LinkedList<TreeNode> queue = new L...原创 2020-04-27 09:37:41 · 74 阅读 · 0 评论 -
31_剑指offer_栈的压入、弹出序列
思路一:建立两个队列,一个栈class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { LinkedList<Integer> queue2 = new LinkedList<>(); for (int i : poppe...原创 2020-04-26 10:28:20 · 84 阅读 · 0 评论 -
30_剑指offer_包含min函数的栈
思路,建立一个辅助的栈辅助栈存放最小值如果push的值小于等于 辅助栈的最顶值(或者辅助栈为空),辅助栈也pushpop时,如果等于 辅助栈的最顶值 辅助栈也pop辅助栈的最顶值就是最小值!!import java.util.Stack;class MinStack { private Stack<Integer> stack; private Sta...原创 2020-04-25 10:27:31 · 123 阅读 · 0 评论 -
29_剑指offer_顺时针打印矩阵
思路:考验思维能力的一道题目,细心即可public class Solution { public int[] spiralOrder(int[][] matrix) { // 行数 int row = matrix.length; if (row == 0) return new int[]{}; // 列数 ...原创 2020-04-24 09:52:06 · 110 阅读 · 0 评论 -
28_剑指offer_对称的二叉树
思路一:递归的想法我建立一个方法,比对两棵树是否是镜面对称的。那么现在判断一棵树是否是对称的树,我就看它的左右子树是否是对称的树就行了。public class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) return true; if (root....原创 2020-04-23 10:11:06 · 99 阅读 · 0 评论 -
27_剑指offer_二叉树的镜像
思路:运用递归的思想public class Solution { public TreeNode mirrorTree(TreeNode root) { // 思路是交换左右子树 即可 if (root == null) return null; TreeNode tmp = root.left; root.left =...原创 2020-04-22 09:51:02 · 193 阅读 · 0 评论 -
26_剑指offer_树的子结构
思路一:我创立一个方法compare,传入两个树A和B,从头结点开始对比,判断B是不是A的一个子树。在isSubStructure方法中,先调用compare方法,如果true,返回true,如果是false,说明从A的头结点开始对比是不对的,再从A的左或者A的右调用isSubStructure方法。public class Solution { public boolean ...原创 2020-04-21 11:05:21 · 95 阅读 · 0 评论 -
25_剑指offer_合并两个排序的链表
感觉思路很清晰,挨个比较挨个对比,把小的拿过来,接着往下比较。public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { // 思路很明显 ListNode head = new ListNode(-1); ListNode tm...原创 2020-04-20 09:07:27 · 81 阅读 · 0 评论 -
24_剑指offer_反转链表
思路:我建立一个新的头,然后依次地转移原来的旧头,到新头。public class Solution { public ListNode reverseList(ListNode head) { if (head == null) return null; ListNode newHead = head; ListNode tmp; ...原创 2020-04-19 10:11:27 · 107 阅读 · 0 评论 -
22_剑指offer_链表中倒数第k个节点
思路一:先遍历,统计总数public class Solution { public ListNode getKthFromEnd(ListNode head, int k) { // 第一种思路,我先计算一下一共有多少个结点 int count = 0; ListNode tmp = head; while (tmp !...原创 2020-04-18 12:31:08 · 87 阅读 · 0 评论 -
21_剑指offer_调整数组顺序使奇数位于偶数前面
双指针的思路前后两个指针如果这个数是奇数,就往后运动如果这个数是偶数,就往前运动交换这两个数进行循环。public class Solution { public int[] exchange(int[] nums) { // 思路是,前后两个指针,往中间运动 int i = 0; int j = nums.length - 1...原创 2020-04-17 08:53:53 · 85 阅读 · 0 评论 -
18_剑指offer_删除链表的节点
题目保证链表中节点的值互不相同常规题目思路是找到上一个结点如果是头结点,返回第二个结点就行了如果不是头结点,找到上一个结点,指向下一个结点就行了class Solution { public ListNode deleteNode(ListNode head, int val) { // 思路是找到上一个结点 // 如果是头结点,返回第二...原创 2020-04-16 11:13:40 · 115 阅读 · 0 评论 -
17_剑指offer_打印从1到最大的n位数
直观思路,计算总数,填充返回(幼稚解法)public class Solution_17 { public int[] printNumbers(int n) { // 输入n,比如输入3,数组中为1,2,3,4....999 // 首先计算总数 int totalNumber = (int) (Math.pow(10, n) - 1);...原创 2020-04-15 11:36:32 · 85 阅读 · 0 评论 -
16_剑指offer_数值的整数次方
思路:一半一半的乘public class Solution_16 { public double myPow(double x, int n) { if (n == 0 || x == 1) return 1; if (n < 0) return 1.0 / myPow(x, -n); if (n % 2 == 0) { ...原创 2020-04-10 00:21:08 · 110 阅读 · 0 评论 -
15_剑指offer_二进制中1的个数
思路:位运算相关的问题可以利用n&(n-1)将n的二进制表示形式的最后一个1给消去通过循环,找出n的二进制表现形式的1的总个数。public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int res = ...原创 2020-04-09 00:03:55 · 91 阅读 · 0 评论 -
14_2_剑指offer_剪绳子
贪心算法class Solution { public int cuttingRope(int n) { //用贪心算法,当n=5,6,7,8,9.。。。的时候 //(n-3)*3>(n-2)*2>n if (n == 2) return 1; if (n == 3) return 2; if ...原创 2020-04-08 23:41:32 · 130 阅读 · 0 评论 -
14_1_剑指offer_剪绳子
贪婪算法,需要数学功底。动态规划的思路,从下至上解决问题。class Solution { public int cuttingRope(int n) { if(n == 2) return 1; if(n == 3) return 2; int[] max = new int[n+1];//建立最优解 max[1] =...原创 2020-04-06 11:01:51 · 111 阅读 · 0 评论 -
13_剑指offer_机器人的运动范围
思路一:广度优先搜索,借助一个辅助队列class Solution { boolean[][] flag; public int movingCount(int m, int n, int k) { flag = new boolean[m][n]; // 用bfs的方法来搜寻。 LinkedList<int[]> ...原创 2020-04-06 10:18:06 · 111 阅读 · 0 评论 -
12_剑指offer_矩阵中的路径
思路:回溯算法关键点,在于回溯,如果你想往下找的话,必须用状态改变和状态恢复来包裹向下找的过程。你现在所在的寻找是某些寻找的分支,当你江郎才尽之时,需将状态完全恢复。class Solution_12 { private boolean[][] flag; private char[][] board; private String word; priva...原创 2020-04-06 00:32:08 · 99 阅读 · 0 评论 -
11_剑指offer_旋转数组的最小数字
找到第一个数值减少的那个数就可以了:时间复杂度O(n)class Solution { public int minArray(int[] numbers) { for (int i = 0; i < numbers.length - 1; i++) { if (numbers[i] > numbers[i + 1]) { ...原创 2020-04-04 10:57:25 · 85 阅读 · 0 评论 -
10_2_剑指offer_青蛙跳台阶问题
完全就是斐波那契数列问题,变种而已class Solution { public int numWays(int n) { if (n == 0) return 1; if (n == 1) return 1; if (n == 2) return 2; int x = 1; int y = 2; ...原创 2020-04-04 09:55:18 · 115 阅读 · 0 评论 -
10_1_剑指offer_斐波那契数列
不能用递归,会有大量重复计算,故用两个变量储存值,由下至上计算class Solution { public int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; int x = 0; int y = 1; int tmp = 0; ...原创 2020-04-04 09:47:53 · 110 阅读 · 0 评论 -
9_剑指offer_用两个栈实现队列
思路:添加元素就往stack1中压入,想删除就从stack2中弹出,stack2是从stack1pop出来压入的class CQueue { Stack<Integer> stack1; Stack<Integer> stack2; public CQueue() { stack1 = new Stack<>();...原创 2020-04-03 10:24:14 · 92 阅读 · 0 评论 -
7_剑指offer_重建二叉树
思路一:递归我有一个方法,传入两个数组和数组的起始结束序号根据第一个数组的第一个数,找到第二个数组相同数的序号num,即树的根第二个数组num之前是左子树,num之后是右子树递归得到根的left和rightclass Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { i...原创 2020-04-03 09:53:40 · 90 阅读 · 0 评论 -
6_剑指offer_从尾到头打印链表
思路一:用一个辅助栈来实现class Solution { public int[] reversePrint(ListNode head) { if (head == null) return new int[0]; // 用一个辅助栈来实现 Stack<Integer> stack = new Stack<>(...原创 2020-04-02 11:05:00 · 88 阅读 · 0 评论 -
5_剑指offer_替换空格
思路一:用String类中的replaceAll方法class Solution { public String replaceSpace(String s) { return s.replaceAll(" ", "%20"); }}思路二:用两个字符数组来实现统计一下空格的总数,计算出最终结果的字符串的长度从前或者从后遍历,如果是空格,就换成“%2...原创 2020-04-02 10:40:46 · 108 阅读 · 0 评论 -
4_剑指offer_二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24]...原创 2020-04-01 11:28:45 · 468 阅读 · 0 评论 -
3_剑指offer_数组中重复的数字
找出数组中重复的数字思路一:排序,然后从头向后扫描思路二:建立一个Set,依次遍历,看是否存在思路三:比较巧妙,重排这个数组【最好的方法】在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2...原创 2020-04-01 10:52:54 · 88 阅读 · 0 评论