- 博客(22)
- 收藏
- 关注
原创 从尾到头打印链表
问题描述:解题思路:从尾到头打印链表,一种依赖栈的特性先进后出 ,另一种方式通过递归链表,在后续位置,将节点值加入新的数组,然后返回也可以做到。题解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution {
2022-01-28 15:15:58
1159
原创 剑指 Offer 13. 机器人的运动范围
问题描述:解题思路:采用bfs从左上到右下搜索class Solution { public int movingCount(int m, int n, int k) { if(k == 0){ return 1; } Queue<int[]> queue = new LinkedList<int[]>(); int[]tx = new int[]{0,1};
2022-01-28 15:00:37
410
原创 leetCode 415. 字符串相加
class Solution { public String addStrings(String num1, String num2) { int i = num1.length()-1; int j = num2.length()-1; int add = 0; StringBuffer res = new StringBuffer(); while(i>=0||j>=0||add!=0){ .
2022-01-26 09:13:47
309
原创 leetCode 300. 最长递增子序列
问题描述:解题思路:采用动态规划解法,定义dp数组,dp[i]是nums[i]结尾的最长递增咨询列的长度。base case nums只有一个元素,最长递增子序列是自己。dp[0] = 1;求整个数组的最长子序列就是求dp数组最大值。找出状态转移方程。f(n)=maxf(i)+1其中i<n且a[i]<a[n]。解题答案:class Solution { public int lengthOfLIS(int[] nums) { int[]dp...
2022-01-18 19:19:34
206
原创 LeetCode 304. 二维区域和检索 - 矩阵不可变
问题描述:解题思路:采用前缀和数组方式求解,维护一个二维preSum数组,专门记录以原点为顶点的矩阵的元素之和。结果等于preSum[x2+1][y2+1]-preSum[x1][y2+1]-preSum[x2+1][y1]+preSum[x1][y1]。题解:class NumMatrix { private int[][]preSum; public NumMatrix(int[][] matrix) { int m = matr...
2022-01-04 20:48:24
149
原创 LeetCode 303. 区域和检索 - 数组不可变
问题描述:解题思路:采用前缀和数组。初始化时,新建一个前缀和数组,用来保存数组第位置的前缀和,查询时,直接用前缀数组和数组高位-前缀数组和数组低位,就可以得到区间数组和。题解:class NumArray { private int[]sum; public NumArray(int[] nums) { sum = new int[nums.length+1]; for(int i = 1;i<sum.length;i++){
2022-01-04 19:46:54
3303
原创 LeetCode 三数之和
问题描述:解题思路:排序加双指针。题解:class Solution { public List<List<Integer>> threeSum(int[] nums) { int n = nums.length; Arrays.sort(nums); List<List<Integer>> res = new ArrayList<List<Integer>>
2022-01-03 21:30:00
60
原创 LeetCode 11. 盛最多水的容器
问题描述:解题思路:和接雨水类问题类似,采用双指针,定义两个指针一个从左向右移动,一个从右向左移动。面积等于 Math.min(height[left],min[right])*(right-left)。实时计算面积,找到最多的结果,就是最多盛的水。题解:class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length-1..
2022-01-03 18:49:27
324
原创 LeetCode 42. 接雨水
问题描述:解题思路:数组处能接的做多的雨水和它左右两边最高的柱子有关。应该为:Math.min(max_left,max_right)。题解1(暴力解法):int trap(int[] height) { int n = height.length; int res = 0; for (int i = 1; i < n - 1; i++) { int l_max = 0, r_max = 0; // 找右边最高的柱子
2022-01-02 18:24:57
3598
原创 LeetCode 200. 岛屿数量
问题描述:解题思路:遍历二位数组,找到‘1’的陆地,采用dfs广度优先遍历改点上下左右所有的点,将‘1’的陆地全部淹没成‘0’,该点向四周扩散,直到扩散到该点周围没有陆地了终止,记作一个岛屿。以此类推。题解:class Solution { public int numIslands(char[][] grid) { int m = grid.length; int n = grid[0].length; int res = 0;
2022-01-02 17:21:25
283
原创 LeetCode 146. LRU 缓存
问题描述:解题思路:采用哈希表+双向链表较为方便时间。双向链表便于维护数据最近使用再前,最久未使用在后。双向链表便于移动删除。题解:class LRUCache { class DLinkedNode{ int key; int value; DLinkedNode prev; DLinkedNode next; public DLinkedNode(){}; public D
2022-01-01 22:36:45
491
原创 LeetCode 102. 二叉树的层序遍历
问题描述:解题思路:二叉树层序遍历采用队列。实现:import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integ
2021-12-28 20:55:01
80
原创 LeetCode 125. 验证回文串
问题描述:解题思路:最简单办法采用双指针,p1从头走,p2从尾部走,验证p1和p2指向的字符是否相等。注意一点体感中只考虑字母和数字字符,忽略大小写,所以预先对字符串进行过滤。题解:class Solution { public boolean isPalindrome(String s) { StringBuffer sb = new StringBuffer(); for(int i = 0;i<s.length();i++){ char
2021-12-28 20:41:25
2596
原创 LeetCode 53. 最大子数组和
问题描述:解题思路:采用动态规划思路,定义已num[i]结尾的最大子数组的和为dp[i],转移方程为:dp[i] = Math.max(nums[i],nums[i]+dp[i-1]) 。然后遍历dp数组,找出最大值。该值为nums的最大子数组。题解:class Solution { public int maxSubArray(int[] nums) { int p = nums.length; int[]dp = new int[p]; .
2021-12-27 20:31:18
393
原创 LeetCode 88. 合并两个有序数组
问题描述:解题思路:输入的两个数组为有序的。新建一个数组int[m+n]。将nums1和nums2元素两两比较,放入int[m+n]中,再重新把int[m+n]放回nums1中。合并完毕。题解:class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p1 = 0; int p2 = 0; int cur = 0; .
2021-12-27 20:22:51
405
原创 LeetCode 230. 二叉搜索树中第K小的元素
问题描述:解题思路:二叉搜索树性质 中序遍历结果是有序的。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(.
2021-12-27 09:43:42
863
原创 LeetCode105. 从前序与中序遍历序列构造二叉树
问题描述解题思路:前序遍历root节点在数组最前面,所以前序遍历的数组第一个就是root节点,找到root节点,遍历中序遍历的数组,找到root节点在中序遍历数组的index。中序遍历找到root节点位置,root节点左右就是root节点的左/右子树。index-中序遍历的其实值就是左子树的个数(leftSize)。有leftSize数组中左子树边界,右子树边界,root节点index全都已知。可以递归构建二叉树了。代码实例:/** * Definition for a bin..
2021-12-26 19:02:09
373
原创 LeetCode 654 最大二叉树
问题描述:解题思路:遍历数组找出最大的数作为root节点。把数组以最大值为分界线,将数组分为两个子数组。以同样的思路递归左右两个子数组,构建出最大二叉树。题解:/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNod...
2021-12-26 17:26:52
160
原创 剑指 Offer 24. 反转链表
问题描述:解题思路:在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。题解:/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/c
2021-12-26 12:02:14
75
原创 LeetCode 114. 二叉树展开为链表
问题描述:解题思路:1,先将左子树展开为单链表,再把右子树展开为单链表。2,把左子树作为右子树。3,把原来右子树接到现在右子树尾部,形成新的链表。题解:/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.v.
2021-12-26 11:39:19
71
原创 LeetCode 116 填充每个节点的下一个右侧节点指针
问题描述:解题思路:把每一层的节点穿起来即可 ,先把属于同一个父节点的左右两个节点穿起来(4->5,6->7)。在把不属于一个父节点的穿起来(5->6)。解题结果:/*// Definition for a Node.class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public No.
2021-12-26 11:14:39
188
原创 LeetCode 226 翻转
问题:解题思路:把一个二叉树的 每一个节点的左右子树交换就会得到一个翻转之后的二叉树。解题结果:/*** 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
2021-12-26 10:50:24
255
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人