获得徽章 7
- 3. Longest Substring Without Repeating Characters
思路:
1. 用一个 Map 来记录每个字母元素最后出现的位置
2. 使用快慢指针来维护一个滑动窗口,窗口中元素不重复
3. 遍历字符串,快指针每次循环向右走一步
4. 若快指针指向的元素在 Map 中存储的位置处于当前滑动窗口之间,更新慢指针为该位置下标值加1
5. 更新快指针元素在 Map 中记录的位置为当前快指针下标
6. 使用一个变量来记录最大的滑动窗口跨度leetcode.com
展开评论1 - 19. Remove Nth Node From End of List
思路:
1. 使用快慢指针遍历链表
2. 快指针先走 n 步,然后快慢指针同时走完剩下的链表,慢指针所在的位置就是倒数第 n 个元素了
3. 定义一个 dummy 虚拟节点,方便处理“要删除的元素是 head” 的情况,不必另写逻辑
4. 剩下的部分就是删除一个链表节点的基础知识leetcode.com
展开评论1 - 11. Container With Most Water
思路:
1. 使用双指针来进行优化,避免两重循环
2. 依次计算 n, n-1, ..., 1 长度的矩形面积
3. 但每次循环只需要更新较小高度的指针
4. 如果 left 指针的高度高于 right 指针的高度,那么在计算 n-1 长度的面积时,右移左指针是没有意义的,我们需要左移右指针
5. 更新最大面积值 maxleetcode.com
展开评论3 - 24. Swap Nodes in Pairs
思路:
1. 使用递归,两个元素为一组,从链表末端往链表头部方向进行两两交换
2. 当链表末端剩下0或1个元素时,不需要再进行交换,直接返回元素
3. 一组元素互换后,函数返回位置靠前的那个元素,以便与上一层递归中的元素连接
4. 图中注释为示例说明,level1,2,3表示递归层数leetcode.com
展开评论4 - 75. Sort Colors
思路:
1. 使用冒泡排序算法,升序排序
2. 从头开始遍历数组,比较相邻的两个元素a,b
3. 若a>b,将a,b元素互换,再从头开始比较
4. 若a<=b,元素无需交换,继续向前遍历直到数组尾部leetcode.com
展开103 - 15. 3Sum
思路:
1. 题目要求是找到三个相加为0的数字,我们换一种思路,先定下一个数字target,然后再去数组里找两个相加为target负值的数字
2. 要找到符合特定条件的两个元素,只需要给数组排序并使用两个指针去找即可
3. 遍历数组执行步骤1和2leetcode.com
展开评论1 - 16. 3Sum Closest
思路:
1. 题目要求是找到三个数字之和与target最接近,我们换一种思路,先定下一个数字num,然后再去数组里找两个数字和num相加
2. 要找到符合特定条件的两个元素,只需要给数组排序并使用两个指针去找即可
3. 遍历数组执行步骤1和2
4. 用一个res保存与target最接近的和值,在遍历中保持更新leetcode.com
相似题目:leetcode.com
展开42 - 155. Min Stack
思路:
1. 如果采用直觉思路,使用 this.stack 正常保存元素,使用 this.min 保存最小数字,则每次出栈时都需要消耗 O(n) 时间来更新 this.min
2. 我们换一种思路,在 this.stack 中,不保存原本的元素 x,而是保存元素 x 与当前最小数字 this.min 的差 sub(x - this.min)
3. 若 sub < 0,将 sub 入栈后还需更新 this.min 的值为 x
4. 出栈时,要返回的是 sub 与上一个最小值(即 sub 入栈时 this.min 的值)的和
5. 若 sub > 0,说明 sub 入栈后 this.min 的值没有改变,所以直接返回 sub + this.min 即可
6. 若 sub < 0,说明 sub 入栈后 this.min 的值有所更新,此时 this.min 的值即为当时入栈时的 x 值,可直接返回 this.min,但还有注意的是,出栈后还需更新 this.min 的值为上一个最小值(即 sub 入栈时 this.min 的值,可以通过 this.min - sub 得到)leetcode.com
展开评论1 - 1. JavaScript 全局环境分为两个部分:"声明环境记录"和"对象环境记录"
2. "声明环境记录"会把在当前作用域中声明的变量以key-value的形式保存起来,一组key-value对也叫一个binding
3. "对象环境记录"和"声明环境记录"相似,不过还多做了一件事,就是把这些bindings同步到一个对象中 (即全局对象),因此这些变量不仅可以通过变量名访问到,还可以通过全局对象的属性访问到
4. var和function关键字声明的变量会在"对象环境记录"中创建bindings (图一)
5. const, let和class关键字声明的对象会在"声明环境记录"中创建bindings (图一)
6. 修改/访问变量值时,"声明环境记录"的优先级更高 (图二)
7. 为什么 JavaScript 全局环境会分成两个部分呢?一般认为全局对象是个错误, 所以在新规范中的const, let, class等只会在"声明环境记录"中创建 bindings。展开413