
数据结构与算法
遇到的数据结构与算法知识
前端攻城fff
一个菜鸟
展开
-
常见排序算法总结
冒泡排序冒泡排序就是比较不停的比较的过程共两层循环, 外面一层实际上是控制次数的, 每循环一次都会有一个最值被交换到了最尾部那么下次循环的时候就不需要带上了每次里层的循环都会重新从头两两进行比对每次只会对交换过的元素的后一个进行重新与下一个进行比较比如 i与 i+1交换了, 那么下次会比较i+1与i+2, 而i不管换过来的与后续被交换来的大小如何, 都会放在下一轮比较中该轮比较只会确定一个最值并一直向后移动, 不会管除最值之外的顺序, 那些会放在下一次进行比较稳定排序, 若a = b, 原原创 2022-01-22 22:05:36 · 583 阅读 · 0 评论 -
动态规划-把数字翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。分析思路:首先注意一点,不是累计计数例如58,5一种,8一种,合起来还是一种 对于8这个数,如果和前面的数组合不能满足翻译(9<x<26),那么对应的是 × 1,即值等于前一个状态的值如果是12,那么1一种原创 2021-11-12 17:42:39 · 296 阅读 · 0 评论 -
动态规划-股票的最大利润
问:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?分析:可用动态规划的思路,保存前面的最高利润并与当前进行取舍过程:遍历每天的价格得到price,price有两种可能身份1,最低买入的价格2,最高的销售利润初始化动态开始时的利润为0,最低买入价格为最大数字那么对于每一个price进行决策,如果它的价格比前面的都低,那么就作为最低的历史价格保存如果当前价格 - 历史价格比前面的利润都高,那么作为最高利润保存下来、一直遍历结束,便得到最高的利润mi原创 2021-11-10 20:22:18 · 279 阅读 · 0 评论 -
位运算-数组中数字出现的次数 III
数组中只有一个数字出现了一次,其余数字都出现了三次,找出这个数像前面两道那样异或肯定是不行了,因为奇数次的数异或不为0那么就沦落到用map计数了吗? 不可能,绝对不对能,位运算整齐活首先明白一点,数组中的数的按二进制展开,并且按位相加,计算相同位置的数值的sum值例如22个数的第八位都是1,那么该位的值就是22用一个数组保存每位的和,根据题中数的大小可以定位32长度,即32位的数字这个数组用于保存nums数组中相同位置的和接下对该数组的每一位对3取模,出现3次的数,同一位也必定出现3次,那么原创 2021-11-09 22:20:16 · 670 阅读 · 0 评论 -
位运算-数组中两个出现一次的数字
除了目标数字,其余都出现了两次。对于它的前身,数组中只出现一次的数字,直接异或到底即可。但是出现一次的数字有两个,那么异或到底的那个数字,是该两个数字的异或值,现在要做的就是将这两个异或后的值分离既然这两个数字是不同的,那么异或的结果必然且至少有一位是1,否则权全为0的话那么这两个数字就相同了,因此我们可以根据这个,找到一个只有该位是1其余都是0的数(记为key)对数组再进行异或运算(后面会说)找到key的目的就是在于将异或的两个值分开,因为这两个数在该位上不同,key的该位是1,那么这两个数必然有原创 2021-11-08 22:41:42 · 200 阅读 · 0 评论 -
位运算-快速幂
实现pow(x, n)的功能如果正常做n次乘法,有1000万次就要乘1000万次,这种解法一般不尽人意可以利用位运算的方法来将n的时间复杂度降为logn例如求3的5次方5的二进制表示为101(前面为0部位不考虑)那么从右向左,对应的权重分别为 2^0, 0, 2^2, 及 将3^5分解为 (3^1) * (3^4), 如图:那么对于n来说,将n的二进制位遍历一次,当某一位为1时,就幂上对应的权重即可需要注意的是无论为0还是1,提升该位的权重需要该数不断的×本身例如权重为0时,就是3.原创 2021-10-28 20:48:28 · 437 阅读 · 0 评论 -
二叉树的最近公共祖先
不同于二叉搜索树, 可以根据节点值的大小来判断要找到目标在哪个位置, 需要对每个节点进行左右子树的递归, 具体分析如下在当前节点的左右两个子树上找到了p,q, 那么就说明该节点就是两节点的最近交叉处, 先画简单点就是这样:一侧子树返回空, 另一侧子树返回了节点, 那么有以下情况返回的是满足p, q均在某一个节点两侧的节点:比如找6, 2两个节点, 以3为根节点向左递归找5, 5的左右不为空, 说明5满足, 那么5向上返回, 该返回值作为3单层次的left而右子树没有找到q,p, 返.原创 2021-10-05 22:14:56 · 105 阅读 · 0 评论 -
约瑟夫环问题
一个0, n-1的队列, 循环轮流报数, 报到m的退出, 再接着从0开始报数普通的方式就是一直遍历, 索引到头了就还从0开始, 一直循环n * m次, 但是这种方式会超时那么可以这样看, 每次到m的时候, 下一轮重新开始, 也就是一个新的数组, 从被删除的索引下一个开始为索引0依次向后, 并且当做一个环, 前面的会向后接上当出列到最后一个人的时候, 他的索引一定是0那么可以向上推到在还有两个人的时候, 它的索引是多少, 有两个人的推出来了, 向上再推三个人的时候索引是多少, 一直推到当有n个人原创 2021-10-02 22:19:43 · 144 阅读 · 0 评论 -
二叉树深度及判断平衡二叉树
二叉树深度可以使用BFS迭代的方式按层次得到, 下面说的是递归的方式获取// 定义一个函数, 用于获取二叉树深度let deep = (root) => { // 一直递归到空节点, 算该条路结束 // 如果该节点为null, 说明本身的深度是0, 也是递归出口 if (!root) return 0 // 如果该节点不为null, 说明还要左节点, 右节点继续向下搜索 // 由左节点得到的左子树深度和右节点得到的右子树深度取最大值即子树的深度 // 再加上1表原创 2021-10-02 10:13:05 · 385 阅读 · 0 评论 -
sort的参数
Array的sort方法默认是将调用该方法的数组里面元素全都转换为字符串, 然后比较每一项对应utf-16对应的单元值大小排序的, 比如9会排在89前面如果想要利用该方法将一个无序integer数组排序的话, 需要给它的参数中传一个回调函数, 该回调函数作为排序的依据如果都是integer类型的话, 简洁写法// 升序arr.sort((a, b) => a - b)// 降序arr.sort((a, b) => b - a)说明:如果 compareFunction(a,原创 2021-09-19 22:46:47 · 822 阅读 · 0 评论 -
dfs二维数组
LeetCode733class Solution { boolean is[][]; int value; public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { value = image[sr][sc]; is = new boolean[image.length][]; for(int i = 0; i < image.length;原创 2021-06-01 21:39:53 · 540 阅读 · 0 评论 -
dfs排列组合
LeetCode46class Solution {// 直接给类添加表示状态的属性 boolean is[];// 保存结果的属性 List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { is = new boolean[nums.length]; df原创 2021-06-01 21:38:28 · 219 阅读 · 0 评论 -
jdk中几个常用方法发掘(进制转换,大数,gcd,规格化小数)
Integer在Integer类中,有些方法可能很实用,例如进制转换例如:parseInt(String s,[index]),可以将字符串[指定参数位置]解析为有符号的int数值;toBinaryString(int i),返回 i 的二进制无符号数的字符串形式;toHexString(int i),返回 i 的十六进制无符号数的字符串形式;toOctalString(int i),返回 i 的八进制无符号数的字符串形式;有了上面的快速进制转化,妈妈再也不用担心还要手撕进制转化了BigIn原创 2021-04-04 09:21:28 · 294 阅读 · 0 评论 -
Calendar日历类使用
public static void main(String[] args) { //Calendar日历类的用法 //该类比date日期类强大,官方推荐使用 //通过Calendar.getInstance()方法根据当前时区和时间生成一个一个Calendar对象 //注意是通过Calendar.getInstance()方法来创建一个Calendar对象,而不是通过new Calendar c2=Calendar.getInstance(); //创建的时候会将当前原创 2021-03-30 21:33:13 · 541 阅读 · 0 评论 -
jdk中对数组和容器排序的方法
import java.util.*;public class 排序方法使用 { public static void main(String[] args) { int[] a=new int[]{5,7,2,6,8,1,4}; //对于基本数据类型的包装类,只有int和char的包装类是Integer和Character,其他都只是首字母大写 Byte[] a2=new Byte[]{5,7,2,6,8,1,4}; ArrayList<Integer> arr=n原创 2021-03-30 19:41:40 · 147 阅读 · 0 评论 -
LeetCode279
题目:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例 1:输入:n = 12输出:3解释:12 = 4 + 4 + 4示例 2:输入:n = 13输出:2解释:13 = 4 + 9原创 2021-02-19 03:57:35 · 191 阅读 · 0 评论 -
首试BFS
题目:这种层次关系的第一时间想到的就是广度优先搜索的方式 , 所以上手尝试一番:广度优先搜索,借助队列辅助,左孩子进队列=>右孩子进队列,出队(父结点)```javascript```javapublic List<List<Integer>> levelOrder(TreeNode root) { //这里二维的list保存每一层结果 List <List<Integer>> res=new ArrayList<原创 2021-02-06 04:27:35 · 197 阅读 · 0 评论 -
杀伤力不高,侮辱性极强的一题
题目:看到这个题想法很简单 , 就暴力递归 , 是1就返回 , 不是就接着递归,直到栈溢出捕获异常返回false确实这种接法通俗易懂(可能是我看见这是个简单题就没有想其他的,其实这样空间时间都 很容易超出) , 由此就引发了捕获栈溢出异常StackOverflowError和普通异常抛出和捕获类似,只不过这个异常不再是Ecption的子类,它和OutofMemoryError同属于Error异常类异常就说到这些 , 下面说下这个杀千刀的题对这个题真的很无奈 , 刚刚那个递归上解法可能没问题但是时间原创 2021-02-04 04:03:03 · 279 阅读 · 0 评论 -
HashSet集合的使用
之前用到set和map集合很少,这里恰好写题的时候遇见了就总结一下用法(Map下次遇见再):题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 //上面说过输出的每个元素都是唯一的,那么就是说即使交集重复的也只会输出一个原创 2021-02-03 03:46:10 · 345 阅读 · 1 评论 -
双端队列ArrayQueue的使用
LeetCode20:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。看到这种匹配的问题,第一反应肯定是利用栈来实现,于是乎发现了java里一个宝藏类:ArrayDeque(双端队列)据说这哥们的性能比Listed还好 , 听名字就晓得是双端,双端的话那么既可以运用在队列上, 也可以用在栈上 这么简单粗暴的容器相见恨晚啊利用ArrayDeque解决这道题:if原创 2021-01-30 02:12:37 · 803 阅读 · 2 评论 -
再看LeetCode92
题目:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL代码演示:(注释很清楚,还有之前自己弄混的知识点)public static ListNode reverseBetween(ListNode head, int m, int n) { //注意踩坑,判断原创 2021-01-27 04:43:01 · 140 阅读 · 0 评论