自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 资源 (1)
  • 收藏
  • 关注

原创 剑指 43

题目 思路 1.最高位1出现的次数 如果最高位为1,那么出现次数就是后4位的值 + 1 不为1,那么出现次数就是10^(10的后4位) 2.后几位出现的1的次数,最高位的值 * 后几位的排列组合(位数 * 10^位数-1 ) 题解 class Solution { public int countDigitOne(int n) { return getCount(String.valueOf(n), 0); } private int getCount(

2021-09-10 20:28:08 171

原创 剑指 42

题目 连续数组的最大和 题解 1.如果和<=0,直接放弃,从下一个数开始重新计算 2.如果和大于0,遇到的下一个数是负数,加上此数之后的sum 和 此数 做比较,如果小,则直接放弃。 3.其他情况正常连接下一个数据, 注意:需将上一次的最大值和当前最大值做比较,取最大。这个是自己忽略的一个点 优化: 只要小于0,就重新开始 大于0,就进行累加,但是会和上一次的sum进行比较,取最大 遍历完成后返回 代码 class Solution { public int maxSubArray(int[]

2021-08-30 17:54:45 155

原创 剑指 41

剑指 Offer 41. 数据流中的中位数 题目: 思路: 求中位数,使用最大堆和最小堆 都为空或一个为空,应该怎么向两个堆里放值 都不为空该怎么放入 放完后判断size,使得size的差距不要超过1,这样就可以计算中位数 注意: 此算法中不能使用BigDecimal 注意等号的位置(上次刷这道题还是1月前,今天看发现是等号写错了,导致过不了) 题解: /** initialize your data structure here. */ public MedianFinder() { this

2021-08-28 18:14:43 125

原创 剑指 40

剑指 Offer 40. 最小的k个数 题目 思路 将快排进行改造,只排序最小的(最左边)的k个数即可,时间复杂度O(n) 顺便复习下快排: 二路: public static void main(String[] args) { int[] a = {38, 99, 5, 11, 11, 78, 11, 4, 11, 456}; System.out.println(Arrays.toString(a)); sort(a, 0, a.length-1); System.o

2021-07-13 00:28:56 134

原创 剑指 39

剑指 Offer 39. 数组中出现次数超过一半的数字 题目: 思路: 1.排序,中位数必定是过半的数字,时间复杂度O(nlogn)。 2.HashMap,这个是最先想到的 3.分治 4.摩尔投票法,yyds 如何理解摩尔投票法: 题解: 摩尔题解: class Solution { public int majorityElement(int[] nums) { int num = nums[0]; int count = 0; for (int

2021-06-30 00:24:01 73

原创 剑指 38

题目: 思路: 使用递归,第一个数字和后面的每一个数字交换一次,第二个数字同。 代码: class Solution { public String[] permutation(String s) { if(s == null || s==""){ return null; } char[] chars = s.toCharArray(); int a = 0; String[] strings

2021-06-29 00:32:10 91

原创 剑指 37

剑指 Offer 37. 序列化二叉树 题目: 思路: 自定义序列化方式,采用先序遍历的房子,如果节点为null则置为一个字符,这样一个序列就搞定了,不像一个先序+中序进行恢复二叉树(而且不能有重复数据) 1.序列化,定义了一个全局变量,作为返回 2.反序列化,使用数组 定义全局变量就跟昨天说的引用传递一样,以后还是尽量避免这种类C++的写法。最后改成了ddfs,返回TreeNode。 代码: /** * Definition for a binary tree node. * public clas

2021-06-27 14:49:48 60

原创 再谈值传递和引用传递

java中只有值传递, 基本类型:值直接保存在变量中 引用类型:变量中保存的是对象的地址 从第一次接触这个问题到现在,知乎两个回答已经看的好几遍了,但是没有真正的理解,所以才会重复的看很多遍,今天刷到剑指第36题的时候,又遇到了这个问题,所以要一次性把这个问题搞懂: 这个是第一次的写法: 这个是第二次的写法: 其实就想是想在递归的时候直接给参数赋值,但是第一种方法两个局部变量一直返回的是null,最后改成全局变量就是可以的,第一种方法时不行的,明显是值传递和引用传递没有搞清楚才产生的问题。 先说结论:

2021-06-27 01:25:12 75

原创 剑指 36

剑指 Offer 36. 二叉搜索树与双向链表 题目: 思路: 1.链表有序,所以要使用中序遍历 (顺便复习下先序和后续) 2.根节点和左子树的最大值相连,和右子树的最小值相连 3.维持一个head和last,每次递归的时候我们只需要维持尾节点即可, /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node() {}

2021-06-27 00:30:46 96

原创 剑指 35

剑指 Offer 35. 复杂链表的复制 题目: 思路: 1.空间换时间,第一遍遍历,将next组装,并将Node,NodeCopy,放入map中,第二遍遍历时,关键代码root.random = map.get(head1.random); 1.1.自己的代码有点丑,看了题解,优化下自己的代码。思路是类似的,不过将第一步的next放到了第二部的构建中进行,变量也少了。 推荐!!! 2.不使用额外的空间。思路: 1.复制拼接 2.构建random 3.拆分 这个题的重点就是random是随机的,不能立刻获

2021-06-05 00:42:53 105

原创 剑指 34

剑指 Offer 34. 二叉树中和为某一值的路径 题目: 思路: 1.每次不对都要回到上一个节点?——使用stack保存,因为要遍历,所以使用Deque 2.Queue保存TreeNode,不对,removeLast 3.属于回溯法 题解 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *

2021-06-04 00:37:05 77

原创 剑指 33

剑指 Offer 33. 二叉搜索树的后序遍历序列 题目: 思路: 没有考虑全面导致 1.多次提交失败,每次都拿失败的用例去改。。。 2.虽然提交通过,但是代码逻辑混乱,思路不变,代码可以优化 思路:后续遍历序列最后一个必是根节点,从始至终,比其小的为左子树,比其大的为右子树。 假设k为临界值,那么k之后的元素都必须比root大,否则返回false。最后reture 前 && 后 即可 (其实还有,都比根节点小和都比根节点大的情况,这两者直接return length-1即可) 题解: c

2021-06-01 23:58:09 181 3

原创 剑指 32

题目: 以三种方式广度优先遍历二叉树: 三种方式: 1.一行打印 2.多行打印 3.多行之字打印 思路: 一行打印: queue 多行打印: 1.queue+两个int(一个记录每一行放入的个数,一个记录每行poll后剩余的个数),当pollInt为0时,就换行打印。将offerInt 赋予 pollInt,然后重新计数 2.queue,使用fori queue.size进行换行——每次放完某一行后,这一行刚好是queue.size() 多行之字打印: 1. 双stack+三int。相比于多行打

2021-05-30 22:48:06 115 1

原创 剑指 31

剑指 Offer 31. 栈的压入、弹出序列 题目: 思路: 看了剑指的思路做的,虽然代码不一样,但是代码都显得乱。简单说下思路: 思路一: 1.按照push的顺序往stack中push,知道poped[0] 2.然后进行stack.pop,如果poped[0++]和stack.peek() 不相等了。那么在pushed里接着找peek,没找到就退出,找到就向1一样,继续往stack中放置 3.注意:思路就是这个思路,自己写的时候一直没有对pushed的位置进行判断导致一直提交报错,睡了一觉,多加了一个参

2021-05-29 23:22:05 80

原创 剑指 30

剑指 Offer 30. 包含min函数的栈 题目: 思路: 无论使用哪种数据结构,最重要的就是每次push,都对应一个min,这样pop的时候就不会有问题。 解答: 双栈 class MinStack { /** * initialize your data structure here. */ private Stack<Integer> stack; private Stack<Integer> minStack; pub

2021-05-29 12:38:08 78

原创 剑指 29

剑指 Offer 29. 顺时针打印矩阵 题目: 思路: 遍历,没什么说的。刚开始自己使用while,没写出来。用for循环简单点。参数也少 题解: class Solution { public int[] spiralOrder(int[][] matrix) { if (matrix.length <= 0) { return new int[0]; } int iMax = matrix.length -1;

2021-05-29 11:26:32 98

原创 剑指 28

剑指 Offer 28. 对称的二叉树 题目: 思路: 思路: 自己犯了两个错误: 1.置换后进行下级比较,这样是不行的,一直比较的是置换前的 2.在第一种方案不行之后,使用保留root,再反转后进行比较,但是是同一个对象,两者还是相同的(为什么ListNode是可以的) 3.使用现有方案:左和右进行比较 ``java /** Definition for a binary tree node. public class TreeNode { int val; TreeNode left

2021-05-26 16:57:46 66

原创 剑指27

剑指 Offer 27. 二叉树的镜像 题目: 思路: 直接递归,没啥说的 题解: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode m

2021-05-26 00:31:08 72

原创 剑指 26

剑指 Offer 26. 树的子结构 题目: 思路: 1、两个值相等怎么办? –相等了,继续往下比较,接下来有一个不相等,回到起点和A树的左右节点进行比较。 –相等的话,下面要一直用&& 2、两个值不想等怎么办? –不想等,上面说了,用||。 3、树结构——递归! 注意:1.不相等,要回到起点进行比较 2.相等和不想等的跳出条件不一样。 题解: /** * Definition for a binary tree node. * public class TreeNode { *

2021-05-26 00:15:13 82

原创 剑指23

题目: 返回链表中环的入口节点:(leetcode 142) 思路: 1.求得位于环中的某个节点 2.通过这个节点的next求的环的长度n 3.双指针,fast指针先移动n个位置,此时,fast和head同时移动,他们首次相遇的位置就是环的入口节点 这个我写的时候,fast = fast.next,如果和2.1类似,那么就不用中间计算长度的过程了! 还有一种思路: 1.都从head开始走,fast每次走两步,slow每次走一步。最终相遇 2.head从头走,meet从此处开始走,每次走一步,最终相遇点就是

2021-05-23 23:37:25 99

原创 剑指25

剑指 Offer 25. 合并两个排序的链表 题目: 思路: 递归,但是要注意: // 刚开始比较后,直接将大的放在后面,这样是错误的,大的还要和小的 的 next进行比较。这样就麻烦了。 // 直接连接一次,直接返回head.next就行。后面无所谓。这样就不用考虑那么麻烦了。 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *

2021-05-23 20:37:52 70

原创 剑指24

剑指 Offer 24. 反转链表 题目: 思路: 1.用temp存放head.next,再变换指针 2.递归(想不出来,后面继续看看) 题解: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public Li

2021-05-21 22:52:48 53

原创 剑指22

剑指 Offer 22. 链表中倒数第k个节点 题目: 思路: 1.倒数第k,正数第length-k+1 2.维持两个指针,使得两个指针的距离为k,当第一个指针走到最后一个节点时,第二个指针指向的就是倒数第k个节点。 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; }

2021-05-20 00:28:41 56

原创 剑指21

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 题目: 思路: 一次遍历,没什么说的。 剑指offer上还给出了另一种解法: 1.首尾同时开工 2.将判断逻辑提成一个公共方法,这样就可以不只是判断奇数偶数,还可以正负等(高级) 代码: class Solution { public int[] exchange(int[] nums) { int i = 0; int j = nums.length - 1; int temp = 0;

2021-05-20 00:08:54 72

原创 剑指18

剑指 Offer 18. 删除链表的节点 题目: 思路: 将下一个节点的值和next给予此节点,就相当于把这个节点删除掉,不要忘记考虑边界 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public L

2021-05-19 00:41:49 63

原创 剑指17

剑指 Offer 17. 打印从1到最大的n位数 题目: 思路: 主要是考察大数的加法和打印,有两种思路,推荐递归(从char[0]到char[length-1] 从0到9即可。然后再if条件处进行打印即可) leetcode这道题竟然返回int[],真的垃圾,还尼玛标记简单。 class Solution { public int[] printNumbers(int n) { char[] s = new char[n]; int temp = n;

2021-05-19 00:06:48 72

原创 剑指16

剑指 Offer 16. 数值的整数次方 题目: 思路: 当时像剪绳子中的贪婪算法中的pow一样计算,但是遇到1.00的2147483647,直接超出限制,所以使用递归将2147483647 进行 >> 1 拆分。 class Solution { public double myPow(double x, int n) { if (n == 0) { return 1; } else if (n == 1) {

2021-05-16 18:43:40 72

原创 剑指15

剑指 Offer 15. 二进制中1的个数 题目: 思路: 位运算的知识:利用>>>(使用>>会超出时间限制,没搞懂) 代码: public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count = 0; while (n != 0) { // 与1做

2021-05-16 13:03:25 86

原创 剑指offer14-2

剑指 Offer 14- II. 剪绳子 II 题目: 思路: 区别于DP,使用贪婪算法。3就是最贪婪的,但是对于4,不能使用33,而是要使用22,所以进行了特殊处理。 注意:代码的实现,根据题意还是要考虑边界问题,可以在以下两点进行思考: 1.是不是要使用long 2.在那个位置进行取模是绝对正确的 代码: class Solution { public int cuttingRope(int n) { if (n == 2) { return 1;

2021-05-15 23:15:06 103

原创 剑指14

剑指 Offer 14- I. 剪绳子 题目: 思路: 第一次接触动态规划,通常是应用于求最优解(这个是最大值) 动态规划的三个特点: 1、求最优解(这里是求成绩的最大值) 2、整体问题的最优解依赖于各个子问题的最优解。(对方10分解,分解为4和6。再对4和6进行分解) 3、各个小问题之间还有有相互重叠的部分。(10=46,6=42) 4、从上往下分析,从下往上求解(类似于递归求解斐波那契,有重叠的部分,从下往上可以避免重复计算) 从4向上一次计算+1,+1,子问题的最优解都存放于数组中。 题解: cla

2021-05-14 00:07:44 146

原创 剑指13

剑指 Offer 13. 机器人的运动范围 题目: 思路: 和12题的回溯法类似。第一次错直接双for,对于16,8,4,直接算出25个,将10 0,……也算进去了,但是从0开始根本不能达到,所以还是要dfs。 代码: class Solution { public int movingCount(int m, int n, int k) { boolean[][] valite = new boolean[m][n]; int count = dfs(0, 0,

2021-05-11 18:38:10 79

原创 剑指offer12

剑指 Offer 12. 矩阵中的路径 题目: 思路: 主要是对矩阵进行搜索类,可以使用回溯法,主要思想就是由某一个点,向其他方向进行递归。 代码: class Solution { public boolean exist(char[][] board, String word) { boolean[][] valite = new boolean[board.length][board[0].length]; char[] chars = word.toChar

2021-05-11 12:50:05 163

原创 剑指11

题目: 剑指 Offer 11. 旋转数组的最小数字 思路: 暴力破解: 只要nums[i+1] < nums[i],那么num[i]就是最小的 二分法: 对于有序或局部有序的数组,可以考虑二分法。 1.因为是数组的旋转,所以一直和high位进行比较 2.mid > high:最小值肯定在右侧 3.< 肯定在左侧,但是不能high = mid -1,因为mid有可能是最小的,所以要多考虑临界元素 4.= 要考虑重复元素的情况,high–,如[3,3,3,3,3,3,3,0,3,3] 代码

2021-05-09 11:17:56 101

原创 2021-05-08

剑指 Offer 10- I. 斐波那契数列 题目: 思路: 递归肯定是不行的,重复计算,将前n-1 和 n-2的值保存起来fori 计算即可。没有审题清楚,没有取模导致一直提交失败,还有取模的位置,要在相加后取模 代码: class Solution { //0,1,1,2,3,5,8,13,21,34,55... public int fib(int n) { if (n == 0) { return 0; } i

2021-05-08 23:33:39 74

原创 剑指09

剑指 Offer 09. 用两个栈实现队列 题目: 思路: 两个栈: 一个进栈,一个出栈 1.进栈负责push 2.当出栈空,进栈不为空时,将进栈中的pop,push到出栈。。再pop 3.都为空时返回-1; 代码: class CQueue { private Stack<Integer> stack1 = new Stack(); private Stack<Integer> stack2 = new Stack(); public CQueue()

2021-05-08 22:36:01 67

原创 剑指06

剑指 Offer 06. 从尾到头打印链表 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路: 1.没有多想,直接倒序插入值到数组中 2.先进后出,直接使用Stack 题解: /** * Definition for singly-linked list. * public class ListNode { * int val; *

2021-05-06 20:00:49 64

原创 剑指07

剑指 Offer 07. 重建二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 限制: 0 <= 节点个数 <= 5000 思路: 1.先序数组的首位是根节点,根节点在中序数组中左边的是左子树,右边的是右子树。 2.root+

2021-05-06 19:02:57 68

原创 剑指05

剑指 Offer 05. 替换空格 题目: 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 限制: 0 <= s 的长度 <= 10000 思路: 1.new 一个新的字符串: 看见这个结果,直接淘汰。应该是S一直在new,使用StringBuffer试试,结果和char数组是类似的。 2.new char数组,跟StringBuffer是类似的 3.正则表达式 各项的结果:

2021-05-05 16:41:02 60

原创 剑指04

剑指 Offer 04. 二维数组中的查找 题目: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定

2021-05-05 15:43:28 69

原创 剑指3

剑指 Offer 03. 数组中重复的数字 题目: 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 思路: 有多种方法: 1.先排序,再遍历 2.额外使用一个map 最优: 改变数组中数据的位置: 因为限制了a[

2021-05-04 22:14:02 57

策略模式与模板模式的区别 - Eviltuzki的个人页面 - OSCHINA - 中文开源技术交流社区.mht

策略模式与模板模式的区别 - Eviltuzki的个人页面 - OSCHINA - 中文开源技术交流社区.mht

2021-06-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除