![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法笔记
Nidhogg_LMF
这个作者很懒,什么都没留下…
展开
-
经典排序算法分析
1.算法概述 1.1 算法分类 1.2 算法复杂度 1.3 相关概念 稳定性:如果a原本在b前面,而a=b,排序之后a仍然在b的前面,叫做稳定,如果a原本在b前面,而a=b,排序之后a可能会出现在b的后面,叫做不稳定 稳定性的重要性: 在实际的应用中,我们交换的不一定只是一个整数,而可能是一个很大的对象,交换元素存在一定的开销; 在基数排序中,即,我们要对多个关键词多次排序,这个时候,就一定要使用稳定算法 2. 冒泡排序 冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟原创 2021-08-11 21:55:43 · 123 阅读 · 0 评论 -
7/29每日一题
1104. 二叉树寻路 思路: 二叉树基本性质,可以知道这是一颗满二叉树,所以每层结点数为2^(n-1),二叉树中父节点为k,它的左子节点下标为2k+1,右子节点是2k+2,所以我们知道label就能反推出路径,由于这棵树成之字形,我们可以找到label对称的结点,并反推出对称结点的路径, 然后将两个路径选择结合起来 代码: class Solution { public List<Integer> pathInZigZagTree(int label) { in原创 2021-07-29 15:50:05 · 47 阅读 · 0 评论 -
7/28每日一题
863. 二叉树中所有距离为 K 的结点 思路: dfs+哈希表,首先dfs搜索二叉树,将结点值和父节点关系存入哈希表中,然后从target位置开始dfs,分三步,向左孩子结点搜索,向右孩子结点搜索,向上搜索,将距离等于k的值放入list集合 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode righ原创 2021-07-29 15:40:27 · 40 阅读 · 0 评论 -
7/27每日一题
671. 二叉树中第二小的节点 思路:遍历二叉树,找出严格大于rootvalue 的最小值 代码: public int findSecondMinimumValue(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int min=root.val,ans=Integer.MAX_VALUE; bool原创 2021-07-29 15:35:03 · 40 阅读 · 0 评论 -
7/26每日一题
1713. 得到子序列的最少操作次数 思路:得到最少子序列的操作数可以转换成target长度减去二者最长公共子序列长度,所以我们只要求最长公共子序列长度即可,但是由于数组长度范围1 <= target.length, arr.length <= 10^5,所以用1143. 最长公共子序列的方法求解时间复杂度是O(mn)会超时,改变思路,因为target中的每个元素都不相同,我们可以利用下标做映射,将arr中的元素映射到target的下标,可以得出一个映射下标数组,最后就是求这两个映射下标数组原创 2021-07-29 15:27:35 · 49 阅读 · 0 评论 -
7/24每日一题
1736. 替换隐藏数字得到的最晚时间 思路:贪心,从最大值往最小值找,考虑两种特殊情况,第一位:若第二位的值已经确定,且值落在区间 [4,9]中时,第一位的值最大只能为 1,否则最大可以为 2; 第二位:若第一位的值已经确定,且值为 2 时,第二位的值最大为 3,否则为 9; 代码: public String maximumTime(String time) { char[] arr = time.toCharArray(); if (arr[0] == '?原创 2021-07-25 22:03:13 · 55 阅读 · 0 评论 -
7/25每日一题
1743. 从相邻元素对还原数组 思路:哈希,遍历adjacentPairs数组,将元素和相邻元素关系存入,然后找一个只有一个相邻元素的元素作为ans数组第一个,然后遍历查找哈希表。 代码: public int[] restoreArray(int[][] adjacentPairs) { Map<Integer,List<Integer>> map = new HashMap<>(); for (int[] adjacentP原创 2021-07-25 21:57:20 · 55 阅读 · 0 评论 -
7/23每日一题
1893. 检查是否区域内所有整数都被覆盖 方法 暴力:第一层for循环遍历left到right,第二层for循环遍历ranges数组,判断[left,right]之间的每个值是否在ranges区间内,如果不在flag=-1,返回flag==-1; 代码 public boolean isCovered(int[][] ranges, int left, int right) { int falg=-1; for(int i=left;i<=right;i++){原创 2021-07-23 23:08:03 · 38 阅读 · 0 评论 -
7/22每日一题
138. 复制带随机指针的链表 思路 哈希+回溯,用哈希表记录每一个节点对应新节点的创建情况,遍历链表递归创建新链表,当新链表创建好了,就回溯开始添加random指针 代码class Solution { Map<Node,Node> map = new HashMap(); public Node copyRandomList(Node head) { if(head==null) return null; if(!map.containsKey(head)){原创 2021-07-22 23:46:34 · 54 阅读 · 1 评论 -
7/21每日一题
剑指 Offer 52. 两个链表的第一个公共节点 思路 双指针,A的链表长度=a+c,B的链表长度=b+c,可得a+c+b=b+c+a即A走完之后再走b就相遇了,定义两个指针然后遍历 代码public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA=headA; ListNode curB=headB; while(curA!=curB){ curA=cur原创 2021-07-22 23:41:37 · 36 阅读 · 0 评论 -
7月20日,每日一题
1877. 数组中最大数对和的最小值 思路:排序+贪心,局部最优:第k大个数和第k小的数组成的数对,可以避免出现较大的数组成数对的情况 代码 public int minPairSum(int[] nums) { Arrays.sort(nums); int pair = 0; for (int i = 0; i < nums.length / 2; i++) { int tmp = nums[i] + nums[n原创 2021-07-20 20:19:17 · 34 阅读 · 0 评论 -
7月19日,每日一题
1838.最高频元素的频数 思路: 排序+暴力,超时, 排序+滑动窗口,数组问题考虑用滑动窗口来做,定义左边界为l,右边界为r,我们只要保证窗口内元素和左边界r的差值和小于等于K即可,设差值和为count,最大可能频数为ans count<=k,不做处理; count>k,减去左边界和右边界的差值,并l++; ans取最大的窗口长度,即max(ans,r-l+1); 代码: public int maxFrequency(int[] nums, int k) {原创 2021-07-19 16:40:23 · 43 阅读 · 0 评论 -
二叉树(二)
110.平衡二叉树 思路: 如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。 分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了 代码: class Solution { public boolean isBalanced(TreeNode root) { return depth(root)!=-1; } public int depth(TreeNode ro原创 2021-06-09 11:24:12 · 45 阅读 · 0 评论 -
二叉树(一)
二叉树遍历 前序遍历 //递归实现 class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<Integer>(); preorder(root,ans); return ans; } public void preorder(TreeNode原创 2021-06-09 11:22:29 · 40 阅读 · 0 评论 -
力扣每日一题
##523.连续的子数组和 方法:使用前缀和+哈希进行判断 首先,创建nums的前缀和数组preNum,用 preSum[i] 表示 从下标 0 到下标i 的前缀和,则nums从下标 p+1到下标 q的子数组的长度为q−p,该子数组的元素和为preNum[q]-preNum[p]。 子数组即满足大小至少为 2 且元素和为 k 的倍数即preNum[q]-preNum[p]是k的倍数且q-p>=2。 当preNum[q]-preNum[p]是k的倍数的时候,preNum[q]和preNum[p]除以原创 2021-06-09 11:10:38 · 328 阅读 · 0 评论