剑指offer
weixin_42623604
这个作者很懒,什么都没留下…
展开
-
剑指offer 2021/8/7
37. 序列化二叉树代码:序列化采用层次遍历,root不为空则将左右子树添加进队列。反序列化首先将输入字符串用’’,“分隔开,然后用指针遍历字符串数组,若不为"null”,则添加进二叉树,否则遍历下一个数组元素。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(原创 2021-08-07 23:24:47 · 46 阅读 · 0 评论 -
剑指offer 2021/8/6
52. 两个链表的第一个公共节点代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNo原创 2021-08-06 23:21:11 · 126 阅读 · 1 评论 -
剑指offer 2021/8/5
41. 数据流中的中位数代码:创建一个大顶堆一个小顶堆,大顶堆中保存较大的元素,小顶堆中保存较小的元素。class MedianFinder { /** initialize your data structure here. */ Queue<Integer> A,B; public MedianFinder() { //小顶堆(默认),且堆中保存较大的元素 A=new PriorityQueue<>();原创 2021-08-05 23:13:42 · 94 阅读 · 1 评论 -
剑指offer 2021/8/4
59 - II. 队列的最大值代码:维护一个双端递减序列,有新元素加入时,将队列中比该元素小的元素出队。原队列执行出队操作时,若出队的元素与双端队列中元素相等,则同时执行出队操作。class MaxQueue { LinkedList<Integer> queue; //维护一个递减序列 LinkedList<Integer> max; public MaxQueue() { queue = new LinkedList<原创 2021-08-04 19:27:38 · 54 阅读 · 0 评论 -
剑指offer 2021/8/3
64. 求1+2+…+n算法思想:if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false;if(A || B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A || B 为 true;本题中,n > 1 && sumNums(n - 1) // 当 n = 1 时 n > 1 不成立 ,此时 “短路” ,终止后续递归。代码:cla原创 2021-08-03 22:31:41 · 44 阅读 · 0 评论 -
剑指offer 2021/8/2
66. 构建乘积数组代码:动态规划class Solution { public int[] constructArr(int[] a) { int len = a.length; if(len == 0) return new int[0]; int[] dp = new int[a.length]; dp[0] = 1; int tmp = 1; //计算i左边的乘积 fo原创 2021-08-02 20:02:50 · 56 阅读 · 0 评论 -
剑指offer 2021/8/1
58 - I. 翻转单词顺序法一:class Solution { public String reverseWords(String s) { if(s.equals("")) return ""; int m = 0; //去掉字符串前的空格 while(s.charAt(m)==' '){ s = s.substring(m+1); if(s.equals原创 2021-08-01 22:14:08 · 54 阅读 · 0 评论 -
剑指offer 2021/7/31
55 - I. 二叉树的深度法一:递归实现DFSclass Solution { public int maxDepth(TreeNode root) { if(root == null){ return 0; } return Math.max(maxDepth(root.left), maxDepth(root.right))+1; }}法二:BFS常规写法,但是要注意一层遍历结束之后res再执行加一操原创 2021-08-01 03:29:48 · 81 阅读 · 0 评论 -
剑指offer 2021/7/30
56 - I. 数组中数字出现的次数代码:class Solution { public int[] singleNumbers(int[] nums) { LinkedList<Integer> list = new LinkedList<>(); for(int num : nums){ if(list.contains(num)){ list.remove(list.index.原创 2021-07-31 04:32:17 · 139 阅读 · 0 评论 -
剑指offer 2021/7/29
27. 二叉树的镜像bfs遍历整个二叉树,并将节点的左右子树互换。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public TreeNode mirro原创 2021-07-30 23:38:51 · 41 阅读 · 0 评论 -
剑指offer 2021/7/28
13. 机器人的运动范围代码:回溯法。class Solution { int m, n; int res = 0; int[][] visited; public int movingCount(int m, int n, int k) { this.m = m; this.n = n; visited = new int[m][n]; dfs(0, 0, k); return res;原创 2021-07-29 00:53:11 · 41 阅读 · 0 评论 -
剑指offer 2021/7/27
38. 字符串的排列代码:回溯。class Solution { LinkedList<String> res = new LinkedList<>(); char[] c; public String[] permutation(String s) { c = s.toCharArray(); backtrack(0); return res.toArray(new String[0]); }原创 2021-07-28 03:16:56 · 42 阅读 · 0 评论 -
剑指offer 2021/7/26
14- I. 剪绳子法一:动态规划。1.dp[2]=1;2.对于总长度为i的绳子,假设减去了长度为j的一段,若剩下的绳子不再继续剪,则乘积为j*(i-j);若剩下的绳子继续剪,则乘积为j * dp[i-j]。j可以取值为2~i-1,最大乘积为max(dp[i], j*(i-j), j*dp[i-j])。class Solution { public int cuttingRope(int n) { int[] dp = new int[n + 1]; //长原创 2021-07-27 02:51:42 · 46 阅读 · 0 评论 -
剑指offer 2021/7/25
57 - II. 和为s的连续正数序列算法思想leetcode题解法一class Solution { public int[][] findContinuousSequence(int target) { int i = 1; double j = 2.0; ArrayList<int[]> list = new ArrayList<>(); while(i < j){原创 2021-07-25 23:30:17 · 84 阅读 · 1 评论 -
剑指offer 2021/7/24
63. 股票的最大利润算法思想:动态规划。当前位置最大值等于max(前一个位置最大值,当前位置值-记录的最小值)。代码:class Solution { public int maxProfit(int[] prices) { if(prices.length == 0) return 0; int min = prices[0], profit = 0; for(int i = 1; i < prices.length; ++i){原创 2021-07-25 03:51:45 · 84 阅读 · 0 评论 -
剑指offer 2021/7/22
62. 圆圈中最后剩下的数字算法思想:动态规划。假设f(n)代表n个数字依次删除第m个节点最后剩下的数字,执行第一次删除操作后,从第m%n个节点开始继续执行下一轮操作,此时可以将它看作f(n-1)的问题,而原数组中的m%n节点对应f(n-1)问题中的0节点,即f(n)=(f(n-1)+m)%n。当n=1时,一定是编号为0的节点为最后剩下的节点,即f(0)=1。通过该状态转移方程可以求解。代码:class Solution { public int lastRemaining(int n,原创 2021-07-23 03:56:48 · 118 阅读 · 0 评论 -
剑指offer 2021/7/21
59 - I. 滑动窗口的最大值算法思想:使用两个指针i,j分别指向滑动窗口左端和右端。将数组元素放入一个队列中,要求:1.队列中必须只包含滑动窗口中的元素,这就需要比较队列中第一个元素和nums[i-1],若相等,则进行出队操作,若不等,则说明此元素在之前已执行出队列操作。1.队首必须是滑动窗口中的最大元素,且队列需满足非严格递减,即每次将nums[j]和队列中最后一个元素进行比较,若大于最后一个元素,则执行出队操作。最后将nums[j]插入队列尾部。代码:class Solution {原创 2021-07-22 04:16:34 · 49 阅读 · 0 评论 -
剑指offer 2021/7/20
30. 包含min函数的栈借助辅助栈代码:class MinStack { LinkedList<Integer> A,B; /** initialize your data structure here. */ public MinStack() { A = new LinkedList<>(); B = new LinkedList<>(); } public void push原创 2021-07-21 01:37:03 · 46 阅读 · 0 评论 -
剑指offer 2021/7/19
48. 最长不含重复字符的子字符串算法思想法一:动态规划+哈希表class Solution { public int lengthOfLongestSubstring(String s) { if(s.length() == 0){ return 0; } HashMap<Character, Integer> map = new HashMap<>(); int[] dp =原创 2021-07-20 02:21:47 · 41 阅读 · 0 评论 -
剑指offer 2021/7/17
07. 重建二叉树代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int[] preorder; HashMap<Integer, Intege原创 2021-07-18 03:18:22 · 42 阅读 · 0 评论 -
剑指offer 2021/7/16
09. 用两个栈实现队列代码:class CQueue { LinkedList<Integer> A, B; public CQueue() { A = new LinkedList<>(); B = new LinkedList<>(); } public void appendTail(int value) { A.push(value); } p原创 2021-07-17 01:51:10 · 58 阅读 · 0 评论 -
剑指offer 2021/7/15
42. 连续子数组的最大和算法思想:令dp[i]为以nums[i]为结尾的连续子数组最大和,dp[0]=nums[0];如果dp[i-1]>0,dp[i]=dp[i-1]+nums[i];否则,dp[i]=nums[i]。输出dp数组中最大的元素。class Solution { public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; dp[0] = nums[0];原创 2021-07-16 02:00:06 · 54 阅读 · 0 评论 -
剑指offer 2021/7/14
22. 链表中倒数第k个节点代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode getKthFromEnd(ListNode head, int k) { in原创 2021-07-15 12:19:15 · 52 阅读 · 0 评论 -
剑指offer 2021/7/13
11. 旋转数组的最小数字算法思想:使用二分法进行查找。将数组看作左右两个数组,设置两个指针i,j分别指向数组首尾,若n[mid]>n[j],说明mid在左边数组中,令i=mid+1;若n[mid]<n[j],说明mid在右边数组中,令j=mid;若n[mid]=n[j],无法判断mid在哪边数组,j–减少区间范围。详细题解(关于为什么不和i进行比较/j–的正确性证明)代码:class Solution { public int minArray(int[] numbers)原创 2021-07-14 03:52:03 · 42 阅读 · 0 评论 -
剑指offer 2021/7/12
10- II 青蛙跳台阶问题代码:简单的动态规划问题。class Solution { public int numWays(int n) { int[] count = new int[n+1]; if(n == 0 || n == 1){ return 1; } count[0] = 1; count[1] = 1; for(int i = 2; i < n+1 ;原创 2021-07-13 01:12:15 · 55 阅读 · 0 评论 -
剑指offer 2021/7/11
05替换空格代码:class Solution { public String replaceSpace(String s) { char[] chars=s.toCharArray(); String result=""; for(int i=0;i<chars.length;++i){ if(chars[i]==' '){ result+="%20"; }el原创 2021-07-12 01:16:14 · 49 阅读 · 0 评论 -
剑指offer 2021/7/10
10 斐波那契数列代码:class Solution { public int fib(int n) { if(n==0){ return 0; } if(n==1){ return 1; } int[] f=new int[n+1]; f[0]=0; f[1]=1; for(int i=2;i<n+1;++i){原创 2021-07-11 00:30:09 · 46 阅读 · 0 评论