数据结构与算法
常见数据结构与算法
失忆机器
不积跬步无以至千里
展开
-
leetcode 120. 三角形最小路径和
动态规划问题。dp数组,方程为dp[j][i] = Math.min(dp[j+1][i],dp[j+1][i+1]) + 当前value值。java代码如下原创 2022-06-10 20:20:53 · 222 阅读 · 0 评论 -
leetcode 24. 两两交换链表中的节点
1、如果整个链表数量是偶数个,两两交换,第二个节点指向第一个节点,第二个节点后面的节点也需要保存,不然就断联系了,所以得保存3个节点,1 2 3,1 和 2 交换位置后,1得指向3,但是3也需要后3后面的那个4交换位置,所以1实际要指向4,可以发现,两两交换后,下一个要指向的元素就是下一个交换后的头节点,是一个递归的操作。1 2 3 4,1 2变成2 1后,1的next要变成下一次交换后的头节点,3 4 交换后就是4 3,所以1.next = 4,整体变成了2 1 4 3 ,3.next = 下一轮交换..原创 2022-05-04 21:11:28 · 715 阅读 · 0 评论 -
leetcode 面试题 17.13. 恢复空格
1、动态规划。dp[i]表示以当前位置结束,能识别的最大字符数。dp[sentence]有了,相减就得了2、dp[i]怎么求?以i结尾作为字符串截取匹配字典中每一个单词,然后取最大的那个。比如此时i来到的了string,字典中有["ng","ing"],遍历字典,dp[i] = Math.max(dp[i],dp[i - word.length()] + word.length())。for(String str : 字典集合)。如果无法匹配出str就进入下一个字段元素匹配,continue。第一个..原创 2022-05-03 23:07:39 · 229 阅读 · 0 评论 -
leetcode33. 搜索旋转排序数组
1、数组而且有有序的特征,所以尽可能往二分法上面想。2、二分法的话,获取到中点后,检查中点是否为目标值,如果是直接返回3、left 和mid 组成的区域是不是一个完整的有序区域比如123就是,4123就不是4、如果left和mid组成的区域是完整有序的,那么就在检查目标值是不是在这个有序区间的,如果是那么缩小检索范围,right = mid - 1。反之目标值就是在另外一边 left = mid + 1;然后继续二分5、如果条件4不满足,说明left和mid组成的不是完整有序的,此时可以..原创 2022-05-02 14:29:37 · 315 阅读 · 0 评论 -
leetcode34. 在排序数组中查找元素的第一个和最后一个位置
1、使用二分查找。先找出出现第一次的位置,然后找出最后一次出现的位置。2、第一次如果没有找到,说明数字中压根就没有这个数,直接返回。3、第二次找的时候,直接检查右边界是不是,如果是就直接返回,不是的话就继续二分,二分到最后的时候会发现只剩两个元素或者剩一个元素。此时就可以来判断结果了。剩最后一个结果的时候肯定就是left == right了已经退出循环了,返回right即可。剩两个的时候会一直循坏,此时返回left即可。class Solution { public int[] ..原创 2022-04-28 15:41:46 · 611 阅读 · 0 评论 -
leetcode179.组合最大数
1、自定义排序规则。两个相加,大的放前面。PriorityQueue<String> queue = new PriorityQueue<String>((a,b)->((b+a).compareTo(a+b)));//如果是(a+b).compareTo(b+a),就是相加的值小的排在前面。2、放入一个优先级队列里。3、取出组装。因为最大数可能溢出。用字符串来表示合理一点。为00的时候处理一下。class Solution { p..原创 2022-04-28 12:34:56 · 211 阅读 · 0 评论 -
leetcode11. 盛最多水的容器
双指针。因为最大值肯定是在其中的,从两边慢慢的检查并且记录最大值。移动短板,因为不管是短板移动还是长版移动,整个装水的矩形长度肯定是要减一的,并且这个矩形的面积是由短板那边决定的,如果移动长版,长度减一,但是短板那边不变,整个面积最大值肯定是减小了,而移动短板,长版那边不变,虽然长度减一了,但是可能短板变成了更高的一个短板了,整个面积就有可能变大。class Solution { public int maxArea(int[] height) { int left = 0..原创 2022-04-25 16:58:26 · 127 阅读 · 0 评论 -
leetcode 2. 两数相加
注意进位信息即可。结束条件。如果最后还有n的时候,一定要补充节点。然后就算遍历到的节点为null,此时对应的数应该为0。class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //进位信息 int n = 0; //遍历到的list1节点的值 int num1; //遍历到的li..原创 2022-04-25 15:37:21 · 109 阅读 · 0 评论 -
leetcode239. 滑动窗口最大值
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { List<Integer> res = new ArrayList(); LinkedList<Integer> queue = new LinkedList(); for(int i = 0; i < nums.length; i++){ ...原创 2022-04-17 00:50:14 · 316 阅读 · 0 评论 -
leetcode79. 单词搜索
回溯class Solution { int[][] visited; public boolean exist(char[][] board, String word) { int col = board[0].length; int row = board.length; visited = new int[row][col]; for(int i = 0;..原创 2022-04-17 00:06:29 · 300 阅读 · 0 评论 -
leetcode138. 复制带随机指针的链表
复制节点(有点赖皮 .......(/狗头))/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; }}*/class Solution { pu..原创 2022-04-11 22:18:29 · 462 阅读 · 0 评论 -
leetcode113. 路径总和 II
经典回溯。一招尝遍天下鲜/** * 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, TreeNode left, Tr...原创 2022-04-11 21:59:34 · 158 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
首先,根节点肯定是在最后一个的,从第一个开始遍历的话,先是小于根节点的,然后又遇见大于根节点的,当这两个过程遍历完(小于了又大于)所到达的终点索引肯定是最后一个了(小于部分就是根节点的左子树,大于部分就是根节点的又子树,递归即可),需要两个指针,一个开始位置,一个结束位置。class Solution { public boolean verifyPostorder(int[] postorder) { return process(posto...原创 2022-04-11 21:25:37 · 316 阅读 · 0 评论 -
逻辑运算符和位运算符
逻辑运算符六个运算符:&与(And)、|或(Or)、!非(Not)、^异或、&&短路与、||短路或1.&运算规则:true&true=true true&false=false false&true=false false&false=false见false为false。2.|运算规则:true|true=true true|false=true false|true=true false|false=false见true为t原创 2022-04-10 10:21:52 · 4653 阅读 · 0 评论 -
leetcode23. 合并K个升序链表
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } *...原创 2022-04-08 17:41:17 · 610 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字/和为s的连续正数序列
双指针class Solution { public int[] twoSum(int[] nums, int target) { int left = 0; int right = nums.length -1; int sum = 0; while(left != right){ sum = nums[left] + nums[right]; ...原创 2022-04-05 16:16:30 · 293 阅读 · 0 评论 -
剑指 Offer II 022. 链表中环的入口节点
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode detectCycle(ListNod...原创 2022-04-05 11:48:09 · 595 阅读 · 0 评论 -
leetcode83/82. 删除排序链表中的重复元素(保留或者全删除)
1)每次重复的只要一次。如果遇见相对了的直接跳过,跳到不等的地方。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { t原创 2022-04-04 14:02:31 · 364 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数
中间的那个数比排序后的左边的大,比右边的小。创建一个大顶堆和小顶堆。每次加数的时候,大顶堆加一次,小顶堆加一次。中位数就是堆顶的情况。画图举例走一次就会了。class MedianFinder { int count = 0; PriorityQueue<Integer> minHeap = new PriorityQueue(); PriorityQueue<Integer> maxHeap = new PriorityQueue(new C...原创 2022-04-04 12:45:02 · 116 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
双端队列来做。维持大小顺序,然后每次要取值的时候看维持的头节点是否过期,过期了就需要弹出。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(k == 0 || nums == null){ return new int[]{}; } int[] res = new int[nums.length - k + 1]; ...原创 2022-04-04 10:41:36 · 271 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
暴力回溯:class Solution { public boolean exist(char[][] board, String word) { int row = board[0].length; int col = board.length; int[][] visited = new int[col][row]; char[] words = word.toCharArray(); for(in...原创 2022-04-03 14:47:05 · 297 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
回溯法即可。/** * 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, TreeNode left, TreeNode ..原创 2022-04-03 12:54:22 · 676 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix.length == 0){ return new int[]{}; } int c0 = 0; int c1 = matrix[0].length-1; int r0 = 0; int r1 = ma...原创 2022-04-01 19:08:39 · 310 阅读 · 0 评论 -
剑指 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 mirrorTree(TreeNode root) { ..原创 2022-04-01 17:38:01 · 511 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
1)先在A中找到B的根节点,上图中就是要先找到在A中找到4。如果找根节点过程中没有找到就返回false。2)找到根节点的值相同的时候,判断他俩的孩子是否相对。使用另外的函数,因为要判空,孩子的判空,如果为空是有意义的,而根节点的判空就是没有找到,直接返回false,而孩子的判空,例如A的孩子为空B的孩子也为空,为空的时候,其实就该返回true了。所以得用两个函数。/** * Definition for a binary tree node. * public class TreeNode..原创 2022-04-01 16:57:57 · 241 阅读 · 0 评论 -
leetcode 39. 组合总和
回溯算法。class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList(); Stack<Integer> path = new Stack(); int pat..原创 2022-04-01 13:19:40 · 257 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
两个指针,快的先走k个,然后一起走到头,看slow位置。画画就会了。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode getKthFromEnd(ListNode head...原创 2022-03-31 22:29:55 · 353 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
1)如果不要求相对次序,也就是不要求稳定性的话,直接用双指针,时间O(n)。class Solution { public int[] exchange(int[] nums) { int i = 0, j = nums.length - 1, tmp; while(i < j) { while(i < j && (nums[i] & 1) == 1) i++; whil...原创 2022-03-31 22:06:22 · 300 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int res = 0; for(int i = 1; i <= 32 ; i++){ if((n&1) == 1){ res++; ...原创 2022-03-31 21:42:24 · 99 阅读 · 0 评论 -
leetcode 154. 寻找旋转排序数组中的最小值 II
因为是有序的,先往二分法方向思路一下,比对mid和左右两边的关系。具体画个图就明白了,如果有重复元素,无外乎就是左边left和右边righj相等,此时把右指针左移一个对结果没有任何影响。...原创 2022-03-31 19:25:52 · 149 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
用hashMap保存中序遍历的值与下标的对应关系。用前序遍历的第一个元素可以在中序遍历中找到左子树个数,利用下标的关系进行递归建树即可。用hashmap定位中序遍历中根节点的下标,根节点的前面就是左子树的数量。然后用左子树的数量到前序遍历中去就可以找到根的左子树范围,然后递归。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ..原创 2022-03-31 19:02:17 · 63 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
选右上角。时间复杂度:O(n+m),最多m减完然后n减完。class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix.length < 1 || matrix == null){ return false; } int m = matrix[0].length-1; ..原创 2022-03-31 18:05:16 · 335 阅读 · 0 评论 -
快速排序--Java
先完成 partition就是一次分割(先写死)。返回中间数,修改partition参数为任意位置。然后递归调用。最后优化为随机数防止退化为O(n^2)。public class QuickSort02 { public static void main(String[] args) { int[] testArray = new int[]{2,2,1,1,3,6,4,7,9,8}; quickSort(testArray, 0, testArray.l..原创 2022-03-31 02:50:36 · 719 阅读 · 0 评论 -
leetcode215. 数组中的第K个最大元素
1) 使用优先级队列。PriorityQueue 容量为k。遍历到最后,就是queue中头节点。class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> queue = new PriorityQueue(); for(int i = 0; i < nums.length; i++){ ...原创 2022-03-31 01:38:46 · 332 阅读 · 0 评论 -
leetcode139. 单词拆分
动态规划。记忆化搜索class Solution { HashMap<String,Boolean> map = new HashMap(); public boolean wordBreak(String s, List<String> wordDict) { boolean res = false; if(s.equals("")){ return true; } ..原创 2022-03-30 17:52:55 · 536 阅读 · 0 评论 -
leetcode137. 只出现一次的数字 II
利用位运算。class Solution { public int singleNumber(int[] nums) { int res = 0; for(int i = 0; i<32; i++){ int count = 0;//计算相加后二进制第i位出现1的的个数。 for(int num : nums){ count+= (num >> i) &..原创 2022-03-30 15:42:32 · 111 阅读 · 0 评论 -
leetcode424. 替换后的最长重复字符
用滑动窗口,细节就是right -left +1 -maxlen 这个来表示里面除了相同元素的其他的数量。用这个来跟k比较然后推动窗口滑动。大于了的话,left++。小于或者等于k,说明k次替换就行了呗。class Solution { public int characterReplacement(String s, int k) { int left = 0; int right = 0; int maxLen = -1; ...原创 2022-03-30 14:12:27 · 110 阅读 · 0 评论 -
leedcode567. 字符串的排列
用数组来表示出现过的字符,滑动窗口维持数量。class Solution { public boolean checkInclusion(String s1, String s2) { int s1Len = s1.length(); int s2len = s2.length(); if(s1Len > s2len){ return false; } ..原创 2022-03-30 12:27:05 · 257 阅读 · 0 评论 -
leedcode.42.接雨水
先找出最大值的下标,如果相等就取右边的那个。遍历元素,左边:当前高度要小于左边的最高高度就可以接水,如果大于了左边的最高高度就更新左边的最大高度。右边:当前高度要小于右边的最大高度,能接的水就是右边最大高度减去当前高度,如果当前高度大于等于了最大高度就更新最大高度。注意:最左边和最右边没法接水的。class Solution { public int trap(int[] height) { int maxValue = 0; int res = 0; ..原创 2022-03-30 12:21:18 · 267 阅读 · 0 评论 -
回溯算法和动态规划
1、回溯结构: //给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); if (k <= 0 || n < k) { return res;原创 2022-03-29 00:12:54 · 1179 阅读 · 0 评论