![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
一颗待收割的小白菜~
又菜又爱学。。。
展开
-
JZ-offer-二叉树的层序遍历
我们知道,二叉树的搜索分为深度优先搜索和广度优先搜索深度优先搜索,简单来说就是竖着遍历,分为前序遍历,中序遍历和后序遍历广度优先搜索,就是横着搜索,因为也叫层序遍历一、JZ-offer-32(1) 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。层序遍历一般用到队列的概念。利用了队列具有先进先出的特性,具体实现过程就是:每次弹出一个节点,就判断该节点是否有子节点,有就将其加入到队列中,这样就实现了队列中的元素始终是按层排队的。function levalOrd.原创 2021-11-30 19:15:21 · 195 阅读 · 0 评论 -
JZ-offer 简单二叉树相关
一、输出二叉树的镜像左右子节点交换即可,采用递归的思路最简单function mirrorTree(root){if(root == null) return null;//交换左右子节点,定义一个中间变量,实现交换let temp = root.left;root.left = root.right;root.right = temp;//往下递归,直到为空mirrorTree(root.left);mirrotTree(root.right);}二、二叉树的深度给原创 2021-11-30 17:14:18 · 336 阅读 · 0 评论 -
LeeCode 2—两数相加
????题目描述:给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。????解决思路:这道题需要返回一个新的链表;创建新节点,给它指定next 就把多个节点连接起来了 。两个节点相加时还需要考虑进位,代码注释中写清楚了整个流程????代码实现:function addTwoNumbers(l1,l2){原创 2021-11-05 20:36:26 · 81 阅读 · 0 评论 -
LeeCode 19—删除链表的倒数第N个节点
????题目描述:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。解题方法:定义两个快慢指针,慢指针slow比快指针fast 滞后n,这样当快指针 fast 移动到来链表末端时,慢指针slow刚好移动到待删除指针的前一个节点处;然后slow指针就跳过倒数第N个节点。function removeNthFromEnd(head,n){ let fast = head,slow = head; for(let i=0;i<n;i++){ fast = fas原创 2021-11-03 21:58:07 · 63 阅读 · 0 评论 -
LeeCode 143—重排链表
????题目描述:给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0→ L1→ … → Ln-1→ Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→ …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换????解题思路:先将所有节点打断,让每个节点都指向null,并且将这些链表存入一个数组,最后通过两个指针将其连接起来function reorderList(head){ let p; cons...原创 2021-11-02 20:54:17 · 97 阅读 · 0 评论 -
LeeCode 92— 反转链表(进阶)
????题目描述:给你单链表的头指针 head 和两个整数left 和 right ,其中left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表????分析:这里的left 和right表示的是链接的位置,可以理解为第几个,总之这是一道反转部分链表的题。最直观的方法就是把要反转的那部分链表单独拿出来,反转之后再跟原来的链表拼接在一起。流程:切割链表——> 反转链表——> 拼接链表——>返回链表????代码:原创 2021-11-01 20:52:22 · 333 阅读 · 0 评论 -
JZ22—链表中倒数第K个节点
????题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。????解答思路:解法1:输出倒数第k个节点,实际上是输出顺数第len-k个节点--所以先求出长度解法2:利用快慢指针,定义两个指针都指向头节点,fast指针前移,移动到k时,就让low指针移动 function get原创 2021-10-30 17:18:18 · 88 阅读 · 0 评论 -
LeeCode 160—相交链表
????题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。????题目分析:如果两个链表在某个节点开始相交,说明在这个节点之后,两链表不仅节点值相同,而且后面节点的长度一样,如果A B两条链表长度不相同,但是要相交,那么他们必须从相交后链表长度相等的位置开始进行比较。思路:让A B 从特殊位置(链表长度短的开始比较),先保证A 是最长的链表function getIntersectionNode.原创 2021-10-30 17:03:31 · 166 阅读 · 0 评论 -
LeeCode 141—环形链表
????题目描述:给定一个链表,判断链表中是否有环????有环就返回true 没有就返回falsefunction hasCycle(head){const res = [];while(head !=null){ if(res.includes(head)){ return true } res.push(head); head = head.next}return false}分析:利用数组存储节点。判断数组中是否有此节点,有就返原创 2021-10-29 19:41:39 · 80 阅读 · 0 评论 -
js中数组方法之 indexOf 和 includes的区别
数组有时候需要知道 元素在数组中的索引号,就需要用到es5数组方法 indexOfes7中的给我们提供了功能更强大的 includes方法:????indexOf 返回元素的索引号,没有就返回-1;includes 返回 布尔值 true or false 有没有该元素const arr = [2,9,7,5,8];console.log(arr.indexOf(5)); //3console.log(arr.indexOf(1)); //-1console.log(arr.i原创 2021-10-29 19:09:59 · 422 阅读 · 0 评论 -
LeeCode 21—合并有序链表
????题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。题目分析:双指针+迭代注意两个链表都是升序的????代码验证:function mergeTwoList(l1,l2){ //创建一个dummy节点--- 最后直接返回dummy的下一个节点dummy.next const dummy = new ListNode(-1); let pre = dummy; while(l1!=null &原创 2021-10-29 13:47:12 · 69 阅读 · 0 评论 -
LeeCode 206—反转链表
????题目描述:给你单链表的头节点head,请你反转链表,并返回反转后的链表链表题 就是 操作指针代码实现:function reverseList(head){ let curr = head; let pre = null; while(curr){//curr.next值先赋给next,以免覆盖,next移动 const next = curr.next;//改变curr指向,给curr.next赋值,指向null curr.next = p原创 2021-10-28 21:13:22 · 76 阅读 · 0 评论 -
LeeCode 33—搜索旋转排序数组
????题目描述:给一个按照升序排序的数组,然后在某一索引处旋转,求出给定数组中target的下标并返回。给定的数组是旋转之后的数组数组中的每一个元素都是独一无二的;????代码验证:按照题目的意思,就是求给定数组中targe值得索引号,并返回利用js中数组得 indexOf方法:function search(nums,target){ let index = nums.indexOf(target); if(index != -1){ return原创 2021-10-27 23:14:10 · 121 阅读 · 0 评论 -
LeeCode121—买卖股票的最佳时机
????题目描述:给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。注意是:只是返回的是最大利润 --- 就是找出差值最大的两个元素,并且这两个元素必须后一个元素大于前一个元素,这样才有利润。返回这个差值。????代码:两种方法:1、双原创 2021-10-26 10:52:13 · 97 阅读 · 0 评论 -
LeeCode88—合并两个数组
题目描述:给你两个按 非递减顺序 排列的整数数组nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列分析:1、可以遍历两个数组,将数组1后面的n个数替换为Nums,然后排序2、用js中的 splice 方法function merge (nums1,m,nums2,n){ //从nums1下标为m开始删除n个元素,然后插入替换的元素,这.原创 2021-10-25 20:40:57 · 144 阅读 · 0 评论 -
LeeCode 1—两数之和
题目描述:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。最简单的方式是:遍历数组,然后用target减去它,得到与它匹配的数pairNum,然后使用nums.indexOf(pairNum)方法判断这个pairNum是否存在function twoSum(nums,target){ let len = nums.length; for(let i=0;i <le...原创 2021-10-24 13:33:40 · 2378 阅读 · 0 评论 -
LeeCode 53 最大子序和
题目描述:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路:累加+比较从第一个数开始累加,如果发现和变小了,就舍弃这个数,将cur变为0,再重新开始累加function maxSubArray(nums){ let cur = 0; let max = -Number.MAX_VALUE; for(let i=0;i<nums.length;i++){ cur += nums[i]; m..原创 2021-10-24 13:12:12 · 53 阅读 · 0 评论 -
LeeCode15_三数之和
题目描述给一个数组nums,判断是否存在三个元素a,b,c满足 a+b+c =0,找出所有和为0且不重复的三元组。思路:1、如果nums的长度小于3,直接返回;2、先从小到大排序,如果第一个数大于0 或者最后一个数小于0 那么一定不存在这样的三个元素。3、这里面的难点是去重 function threeSum(nums){ let len = nums.length; if(len < 3) return [];原创 2021-10-23 19:31:56 · 96 阅读 · 0 评论