算法题记录
Contents
查找
有序数组的二分查找
包含重复元素有序数组的二分查找
猜数字大小
在排序数组中查找元素的第一个和最后一个位置
搜索插入位置
搜索旋转排序数组
搜索旋转排序数组2
寻找排序数组中的最小值
x的平方根
排序
基础排序算法
合并两个有序数组
删除数组中的重复元素
移除元素
移动零
数组中出现次数大于一半的数字
合并排序数组
寻找第K大的元素
最小的K个数(topK问题)
树
重建二叉树
最大二叉树
合并二叉树
二叉搜索树中的搜索
验证二叉搜索树
二叉搜索树的绝对值之差
二叉搜索树的众数
二叉树的最近公共祖先
二叉搜索树的最近公共祖先
[链接](二叉搜索树的最近公共祖先 - 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com))
二叉搜索树的插入操作
二叉搜索树的删除操作
二叉搜索树的修剪
将二叉树转换为累加树
翻转二叉树
二叉树的前序遍历
二叉树的中序遍历
二叉树的后序遍历
二叉树的层序遍历
二叉树的层序遍历2
二叉树的之字形层序遍历
N叉树的层序遍历
从上到下打印二叉树
二叉搜索树中第k小的元素
将有序数组转换为二叉搜索树
将有序链表转换为二叉搜索树
二叉树的右视图
二叉树的层平均值
二叉树的层最大值
填充每个节点的下一个右侧节点指针
树的子结构
另一棵树的子树
对称二叉树
相同的树
二叉树的最大深度
N叉树的最大深度
二叉树的最小深度
完全二叉树的节点个数
平衡二叉树
左叶子之和
找树左下角的值
路径总和
回溯算法
全排列
全排列2
子集
子集2
组合
组合总和
小结
1.
全排列:结果是有序的,即[1,2,3]和[2,1,3]是两个不同的结果
组合:结果是无序的,即[1,2,3]和[2,1,3]是相同的结果
那么这两者的处理方式分别是什么呢:
针对组合问题,具体的做法是:每一次搜索的时候设置 下一轮搜索的起点 begin
|
|
|
|
2.
对于子集中
可以对每一层选与不选元素进行分类,最后的叶子节点即为所求结果
3.
对于全排列2中,因为数组存在重复元素,为了删除重复的结果集,所以需要采用剪枝操作。
大体的思想就是
通过
i>0&&nums[i]==nums[i-1]&&!used[i-1]
可以让同一层级,不出现相同的元素。即 1 /
2 2 这种情况不会发生 但是却允许了不同层级之间的重复即: /
5 5 例2 1 / 2 这种情况确是允许的 / 2
对于子集2中,数组中的元素存在重复元素,同样的通过i>begin&&nums[i]==nums[i-1]
来保证同一层中不出现重复元素
对于组合总和问题2,其实最大的不同也就是元素存在重复元素,解决方式同样是i > begin && candidates[i] == candidates[i - 1]
来保证同一层不出现重复元素。
这里可以看出
- 如果解的无序的,就使用
begin
变量来设置下一轮搜索起点 - 如果数组中存在重复元素,就利用类似
i > begin && candidates[i] == candidates[i - 1]
的方式来保证同一层不出现重复元素。以此进行剪枝操作。
排列序列
二叉树的所有路径
二叉树中和为某一值的路径
递增子序列
[链接](递增子序列 - 递增子序列 - 力扣(LeetCode) (leetcode-cn.com))
划分为k个相等的子集
字符串的排列
动态规划
零钱兑换
爬楼梯
使用最小花费爬楼梯
将数字翻译成字符串
解码方法
完全平方数
整数拆分
单词拆分
组合总和4
零钱兑换2
分割等和子集
最后一块石头的重量
目标和
一和零
连续子数组的最大和
连续子数组的最大乘积
最长连续递增子序列
最长递增子序列
最长递增子序列的个数
无重叠区间
最长数对链
礼物的最大价值
打家劫舍
打家劫舍2
打家劫舍3
不同路径
不同路径2
买卖股票的最佳时机
买卖股票的最佳时机2
买卖股票的最佳时机含冷冻期
买卖股票的最佳时机含手续费
最长公共子序列
最长公共字符列2
最长公共子序列3
回文子串
最长回文子串
通配符匹配
链表
反转链表
反转链表2
K 个一组翻转链表
删除链表的节点
合并两个排序的链表
合并K个已排序链表
链表中倒数第k个节点
两个链表的第一个公共节点
复杂链表的复制
从尾到头打印链表
二叉搜索树与双向链表
有序链表转换成二叉搜索树
LRU实现
链表相加
链表中是否存在环
环状链表2
删除链表的倒数第 N 个结点
链表排序
链接