
算法
常见算法题
会_更好
这个作者很懒,什么都没留下…
展开
-
从尾到头打印链表
问题描述:解题思路:从尾到头打印链表,一种依赖栈的特性先进后出 ,另一种方式通过递归链表,在后续位置,将节点值加入新的数组,然后返回也可以做到。题解:/** * 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 阅读 · 0 评论 -
剑指 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 · 412 阅读 · 0 评论 -
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 · 311 阅读 · 0 评论 -
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 · 207 阅读 · 0 评论 -
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 · 3600 阅读 · 0 评论 -
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 · 61 阅读 · 0 评论 -
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 · 81 阅读 · 0 评论 -
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 · 325 阅读 · 0 评论 -
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 · 2597 阅读 · 0 评论 -
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 · 284 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 864 阅读 · 0 评论 -
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 · 395 阅读 · 0 评论 -
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 · 406 阅读 · 0 评论 -
剑指 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 · 76 阅读 · 0 评论 -
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 阅读 · 0 评论 -
LeetCode105. 从前序与中序遍历序列构造二叉树
问题描述解题思路:前序遍历root节点在数组最前面,所以前序遍历的数组第一个就是root节点,找到root节点,遍历中序遍历的数组,找到root节点在中序遍历数组的index。中序遍历找到root节点位置,root节点左右就是root节点的左/右子树。index-中序遍历的其实值就是左子树的个数(leftSize)。有leftSize数组中左子树边界,右子树边界,root节点index全都已知。可以递归构建二叉树了。代码实例:/** * Definition for a bin..原创 2021-12-26 19:02:09 · 374 阅读 · 0 评论 -
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 · 189 阅读 · 0 评论 -
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 · 256 阅读 · 0 评论 -
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 阅读 · 0 评论