算法与数据结构
Algorithm
宝哥大数据
大数据、机器学习、深度学习
展开
-
递归与回溯 知识点 面试考点
一、递归1.1、递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响, 比如n变量如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。...原创 2020-05-26 22:56:33 · 327 阅读 · 0 评论 -
leetcode--138. 复制带随机指针的链表
138. 复制带随机指针的链表面试题35. 复杂链表的复制1、HashMap第一遍复制节点的 val ,next 和 random 暂时为空,并将源节点和克隆节点形成映射存放在一个 HashMap 中。第二遍拷贝next、random节点。/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.v原创 2020-05-23 10:05:24 · 236 阅读 · 0 评论 -
链表 知识点 面试考点
一、链表的介绍1.1、链表的概念 是一种线性表,但是并不会按线性的顺序存储数据,1.2、有头结点与没头结点链表原创 2020-05-17 11:49:42 · 341 阅读 · 0 评论 -
队列与栈 知识点 面试考点
一、什么是队列 先进先出、一种操作受限的线性表数据结构、支持队尾插入元素,在队头删除元素。 队列的应用也非常广泛如:循环队列、阻塞队列、并发队列、优先级队列等。二、使用数组模拟队列2.1、顺序队列2.1.1、代码实现package com.chb.queue;import java.util.Scanner;public class MyQueue { private int capacity; private int front; private int r原创 2020-05-11 23:51:37 · 441 阅读 · 0 评论 -
56. 合并区间
一、56. 合并区间1.1、题目描述1.2、题解1.2.1、对数组先按照每个元素的第一个值排序,然后比较,确认合并边界class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: ret = [] if len(intervals) < 1...原创 2019-12-02 09:48:01 · 185 阅读 · 0 评论 -
287. 寻找重复数
一、287. 寻找重复数1.1、题目描述1.2、题解说明中有限制:不能修改原数组,所以不能对数组排序,只能使用O(1)的空间,所以不能使用集合去重。1.2.1、二分法此题重点是数值从1~n, 和索引位置一直, 题意中有重复数据, 那么重复数,要么在中位数的左边,要么在中位数的右边,通过统计小于mid的次数来判断在左边还是右边。class Solution: def f...原创 2019-11-30 16:45:21 · 117 阅读 · 0 评论 -
162. 寻找峰值
二分查找原创 2019-11-30 16:13:04 · 109 阅读 · 0 评论 -
二分查找
一、基本思想二、实例35. 搜索插入位置704.二分查找x 的平方根; 第二种方法-牛顿法实现 pow(x, n) ,即计算 x 的 n 次幂函数。原创 2019-11-30 15:16:54 · 125 阅读 · 0 评论 -
35. 搜索插入位置
一、35. 搜索插入位置1.1、题目描述1.2、题解1.2.1、二分查找class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while left <= rig...原创 2019-11-30 15:14:25 · 122 阅读 · 0 评论 -
4. 寻找两个有序数组的中位数
一、4. 寻找两个有序数组的中位数1.1、题目描述: 有序,中位数1.2、题解1.2.1、简单粗暴,先将两个数组合并,两个有序数组的合并也是归并排序中的一部分。然后根据奇数,还是偶数,返回中位数。class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> fl...原创 2019-11-30 14:10:19 · 189 阅读 · 0 评论 -
222. 完全二叉树的节点个数
一、222. 完全二叉树的节点个数1.1、题目描述1.2、题解1.2.1、递归1.2.2、层次迭代1.2.3、二分查找 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 它是一棵空树或者它的叶子节点只出在最后两层,若最后一层不满则...原创 2019-11-29 10:23:11 · 220 阅读 · 0 评论 -
144. 二叉树的前序遍历
一、144. 二叉树的前序遍历1.1、题目描述1.2、题解1.2.1、递归: 根节点->左子树->右子树class Solution: def __init__(self) -> None: self.ans = [] def preorderTraversal(self, root: TreeNode) -> List[int]:...原创 2019-11-27 15:21:03 · 166 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针
一、116. 填充每个节点的下一个右侧节点指针1.1、题目描述1.2、题解1.2.1、层次遍历class Solution: def connect(self, root: 'Node') -> 'Node': if not root: return None que = [root] while que: ...原创 2019-11-27 11:05:29 · 118 阅读 · 0 评论 -
572. 另一个树的子树
一、572. 另一个树的子树1.1、题目描述1.2.1、递归class Solution: def isSubtree(self, s: TreeNode, t: TreeNode) -> bool: if not s and not t: return True if not s or not t: return False #...原创 2019-11-25 10:55:41 · 231 阅读 · 0 评论 -
分支限界法
一、分支限界法1.1、分支限界法——对解空间的一种策略搜索(广度优先搜索)原创 2019-11-25 08:12:22 · 470 阅读 · 0 评论 -
22. 括号生成
一、22. 括号生成1.1、题目描述1.2.1、回溯class Solution: def generateParenthesis(self, n: int) -> List[str]: ans = [] self.__dfs('', ans, 0, 0, n) return ans def __dfs(sel...原创 2019-11-21 14:50:53 · 138 阅读 · 0 评论 -
全排列+回溯
一、46. 全排列二、47. 全排列 II原创 2019-11-18 17:19:46 · 187 阅读 · 0 评论 -
组合+回溯
一、39. 组合总和1.1、题目描述1.2.1、排序+回溯+剪枝class Solution: def __init__(self) -> None: self.res = [] def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: ...原创 2019-11-18 16:37:25 · 241 阅读 · 0 评论 -
1143. 最长公共子序列(Longest Common Subsequence)
一、1143. 最长公共子序列(LCS)1.1、题目描述1.2.1、动态规划原创 2019-11-15 11:26:40 · 275 阅读 · 0 评论 -
300. 最长上升子序列
一、300. 最长上升子序列1.1、题目描述二、583. 两个字符串的删除操作三、712. 两个字符串的最小ASCII删除和原创 2019-11-13 15:03:38 · 217 阅读 · 1 评论 -
96. 不同的二叉搜索树
一、96. 不同的二叉搜索树1.1、题目描述1.2.1、class Solution: def numTrees(self, n: int) -> int: gn = [0] * (n+1) gn[0] = 1 gn[1] = 1 for i in range(2, n+1): ...原创 2019-11-13 10:04:32 · 189 阅读 · 0 评论 -
1217. 玩筹码
一、1217. 玩筹码1.1、题目描述, 阅读题: 每个筹码的 位置 存在chips中1.2.1、统计筹码所在位置的奇偶数量奇数位置到奇数位置不消耗偶数位置到偶数位置不消耗奇数位置到偶数位置消耗1个单位所以最终停留在奇数位置还是偶数位置,只需要判断奇数位置多还是偶数位置多。class Solution: def minCostToMoveChips(self, chips:...原创 2019-11-12 16:12:41 · 339 阅读 · 0 评论 -
1221. 分割平衡字符串
一、1221. 分割平衡字符串1.1、题目描述1.2.1、计数(贪心算法)class Solution: def balancedStringSplit(self, s: str) -> int: stack = 0 cnt = 0 for c in s: if c == 'R': ...原创 2019-11-12 14:34:05 · 254 阅读 · 0 评论 -
413. 等差数列划分
一、413. 等差数列划分1.1、题目描述1.2.1、直接暴力法class Solution: def numberOfArithmeticSlices(self, A: List[int]) -> int: count = 0 n = len(A) for i in range(n-2): d = A...原创 2019-11-12 10:11:35 · 351 阅读 · 0 评论 -
120. 三角形最小路径和
一、120. 三角形最小路径和1.1、题目描述初看,和64.最小路径和有点相似,但是本题的结束位置并不是右下角。1.2.1、动态规划class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: m = len(triangle) mini = [0] * m...原创 2019-11-11 15:36:11 · 123 阅读 · 0 评论 -
64. 最小路径和
一、64. 最小路径和1.1、题目描述1.2.1、动态规划我们新建一个额外的 dp 数组,与原矩阵大小相同。在这个矩阵中,dp(i,j) 表示从坐标 (i, j)到右下角的最小路径权值。我们初始化右下角的 dp 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:dp(i,j)=grid(i,j)+min(dp(i+1,j),dp...原创 2019-11-11 14:09:39 · 135 阅读 · 0 评论 -
1227. 飞机座位分配概率
一、1227. 飞机座位分配概率1.1、题目描述1.2.1、动态规划如果第一个人正好坐在自己的位置,那么之后所有的人都会坐在自己的位置。如果第一个人正好坐在第n个人的位置,那么第n个人没可能坐在自己的位置。如果第一个人坐在除了自己位置以及第n个人的位置之外的任何位置,情况就如同n-1个座位情况。所以转移方程为: dp[i] = 1 / i + (i - 2) / i * dp[i -...原创 2019-11-11 11:15:15 · 828 阅读 · 0 评论 -
877. 石子游戏
一、877. 石子游戏1.1、题目描述1.2.1、动态规划class Solution: def stoneGame(self, piles: List[int]) -> bool: n = len(piles) # f(i,j)表示对于下标 i 到下标j的(j−i+1)堆石子,当前选手相对于对手能够多出的石子数。 dp = ...原创 2019-11-11 10:37:36 · 216 阅读 · 0 评论 -
338. 比特位计数
一、338. 比特位计数1.1、题目描述1.2.1、直接法: 根据191. 位1的个数(也被称为汉明重量)class Solution: def countBits(self, num: int) -> List[int]: ans = [0] * (num+1) for i in range(num+1): ans[...原创 2019-11-10 14:41:08 · 144 阅读 · 0 评论 -
191. 位1的个数(也被称为汉明重量)
一、191. 位1的个数1.1、题目描述1.2.1、遍历数字的 32 位。如果某一位是 11 ,将计数器加一class Solution(object): def hammingWeight(self, n): count = 32 c = 0 while count > 0: if n&1 ==...原创 2019-11-10 12:42:33 · 279 阅读 · 0 评论 -
62.不同路径-动态规划
一、62. 不同路径1.1、题目描述1.2.1、排列组合1.2.2、动态规划我们令 dp[i][j] 是到达 i, j 最多路径动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1],注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1class Solution: def uniquePaths(sel...原创 2019-11-09 14:13:48 · 304 阅读 · 0 评论 -
206. 反转链表
一、206. 反转链表1.1、题目描述1.2.1、迭代class Solution: def reverseList(self, head: ListNode) -> ListNode: pre = None cur = head while cur: tmp = cur.next ...原创 2019-11-08 17:28:19 · 114 阅读 · 0 评论 -
回文
一、125. 验证回文串1.1、题目描述1.2.1、双指针class Solution: def isPalindrome(self, s: str) -> bool: l = 0 r = len(s)-1 while l < r: if s[l].isalnum() and s[r].isalnum():...原创 2019-11-08 10:36:05 · 168 阅读 · 0 评论 -
5. 最长回文子串
一、5. 最长回文子串1.1、题目描述原创 2019-11-08 10:09:16 · 171 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树
树前序遍历中序遍历分治算法原创 2019-11-07 15:25:45 · 153 阅读 · 0 评论 -
分治算法
一、分治算法1.1、概念 在计算机科学中,分治法是构建基于多项分支递归的一种很重要的算法范式。字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅立叶变换(快速傅立叶变换)。 另一方面,理解及设计分治法算法的能力需要一定时间...原创 2019-11-07 15:23:12 · 306 阅读 · 0 评论 -
671. 二叉树中第二小的节点
一、671. 二叉树中第二小的节点1.1、题目描述1.2.1、转化为求左右子树的最小值,如果左右子树最小值都大于根节点的值取较小的值。其他情况取左右子树较大的值。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# ...原创 2019-11-02 16:32:23 · 240 阅读 · 0 评论 -
669. 修剪二叉搜索树
一、669. 修剪二叉搜索树1.1、题目描述class Solution: def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode: if not root: return root if root.val < L: # nod...原创 2019-11-01 17:59:16 · 108 阅读 · 0 评论 -
两数之和-双指针
1.1、1. 两数之和1.2、167. 两数之和 II - 输入有序数组class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: i = 0 j = len(numbers)-1 while i < j: ...原创 2019-11-01 17:37:26 · 576 阅读 · 0 评论 -
层次遍历
一、层次遍历二、训练2.1、637. 二叉树的层平均值`# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass ...原创 2019-11-01 17:05:37 · 1608 阅读 · 0 评论