回溯
增量构造答案的过程 用递归解决
回溯三问
当前操作
子问题
下一个子问题
[17、电话号码的字母组合][https://leetcode.cn/problems/letter-combinations-of-a-phone-number/]给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
12345678910111213141516171819202122232425class Solution {public: vector<string> number_string = {"", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; vector<string& ...
二叉树
104、二叉树的最大深度[二叉树的最大深度][https://leetcode.cn/problems/maximum-depth-of-binary-tree/]
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
时间复杂度 O(n)
空间复杂度 O(n)
123456789101112131415161718192021/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, Tre ...
二叉搜索树
[98、验证二叉搜索树][https://leetcode.cn/problems/validate-binary-search-tree/]给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
前序遍历通过更新区间,当值不在区间内就返回false
12345678910111213141516171819202122232425262728293031/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left( ...
js基础
JavaScript简介名字、版本
标准名称:ECMAScript (ES)
TC39 - 负责制定ECMAScript语言标准
W3C - 推动整个web技术的发展和标准化
标准划分
ES6之前
ES6之后
宿主环境
浏览器
node
词法结构
注释
字面量 - 直接出现在程序中的数据值
标识符和保留字
标识符 - 必须以字母下划线或者$开头
unicode
UTF-32 固定四个字节
UTF-16 - 2、4个字节
UTF-8 - 1-4个字节
可选的分号
数据类型
原始类型
number - 无法精确表示浮点数
字符串
布尔
引用类型
对象
空类型
undefined - 未定义 数值没有
变量不赋值默认为undefined
typeof undefined === undefined
null 对象没有
typeof null === object
es6新类型
Symbol - 唯一的值
Symbol('a') === Symbol('a') \\ flase
BigInt
为大数字后+n
只能 ...
前后指针
237、删除链表[删除链表][https://leetcode.cn/problems/delete-node-in-a-linked-list/]
有一个单链表的 head,我们想删除它其中的一个节点 node。
给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。
链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:
给定节点的值不应该存在于链表中。
链表中的节点数应该减少 1。
node 前面的所有值顺序相同。
node 后面的所有值顺序相同。
用后面的值代替前面的值
123456789101112131415161718/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; * ...
快慢指针
876、链表的中间节点[链表的中间节点][https://leetcode.cn/problems/middle-of-the-linked-list/]
给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
慢指针每次前进一格,快指针每次前进两格
12345678910111213141516171819202122/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solutio ...
反转链表
206、反转链表[反转链表][https://leetcode.cn/problems/reverse-linked-list/]
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
三个变量来控制,一个为当前节点,一个为前置节点,一个为后置节点,将当前节点的下个置为前置,将后置的下个置为当前,前置变为当前,当前变为下个。
123456789101112131415161718192021222324252627/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) { ...
二分查找
有二断性
34、在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
二分 两次二分,第一次找到左边起始位置,第二次找右边位置
123456789101112131415161718192021222324252627282930313233class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int n = nums.size(); int l = 0; int r = n - 1; while(l <= r){ int mid = l + r >> 1; ...
设计模式
六大原则
开闭原则 (Open-Closed-Principle)
核心:一个软件实体应当对拓展开放,对修改关闭。即:软件实体应尽量在不修改原有代码的情况下进行拓展
里氏代换原则(Liskow-Substitution-Principle)
核心:所有引用基类(父类)的地方,都必须能透明地使用其子类的对象。
依赖倒转原则(Dependency-Inversion-Principle)
核心:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而非针对实现编程。
单一职责原则(Single-Responsibility-Principle)
核心:一个类只负责一个功能领域中相应的职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
接口隔离原则(Interface-Segregation-Principle)
核心:使用多个专门的接口,而不使用单一的总接口。即 客户端不应该依赖于那些它不需要的接口。
迪米特法则(Law-Of-Demeter)
核心:一个软件实体应当尽可能少地与其他实体发生作用。一个对象应当对其他对象有尽可能少的了解,只和 ...
相向双指针
167、两数之和 II - 输入有序数组[两数之和 II - 输入有序数组][https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/]
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
暴力–两重循环O(n^2)
利用有序O(n)
利用两个变量(L, R)指向当前最小和最大的树,与目标数比较。如果大于,去掉最大的(L右移),小于,去掉最小的数(R左移)。
123456789101112 ...