随笔分类 - 数据结构和算法
摘要:KMP算法 解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。 说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。 首先,对于这个问题有一个很单纯的想法 Brute-Fo
阅读全文
摘要:快速排序是排序算法中效率相对较高的,但使用的人却是比较少,大家一般信手拈来的排序算法就是冒泡排序。因为冒泡排序主观,容易理解,而快速排序使用到了递归,大家可能就有点不知所措了。 算法分析 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然
阅读全文
摘要:经典例题: 1、求两个链表的第一个公共节点 思路: 两个链表长度分别为L1+C、L2+C, C为公共部分的长度, 第一个人走了L1+C步后,回到第二个人起点走L2步; 第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为L1+L2+C时就两个家伙就相遇。 隐藏条件,第一个公共的
阅读全文
摘要:数组 二分法查找 前提 数组为有序数组; 数组中没有重复元素。 优点 逻辑简单 难点 涉及很多边界条件,对区间定义不清楚,二分法则容易写乱 解决方法: 原则: 循环不变量规则 二分查找中,保持区间不变量,在循环寻找中每一次边界的处理都要坚持区间的定义来操作, 方式: 左闭右闭 左闭右开 左闭右闭 第
阅读全文
摘要:数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 也就是说,想法很简单,但实现起来 可能就不是那么回事了。 首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便
阅读全文
摘要:内存管理 不同语言的内存管理 不同语言的内存管理方式: C/C++这种内存堆空间的申请和释放完全靠自己管理 Java 依赖JVM来做内存管理,不了解jvm内存管理的机制,很可能会因一些错误的代码写法而导致内存泄漏或内存溢出 Python内存管理是由私有堆空间管理的,所有的python对象和数据结构都
阅读全文
摘要:算法性能提升总结 巧用hash表 利用hash,来进行映射,从而降低代码的复杂度,和冗余度 eg: 求两个数之和 class Solution: def twoSum(self, nums: List[int], target: int)->List[int]: """ 暴力方法实现时间复杂度为O(
阅读全文
摘要:算法性能分析 时间复杂度分析 递归算法的时间复杂度 例题一: 求x的n次方 用一道题目,同样使用递归算法, 有的写出了O(n)的代码,有的写出了O(longn)的代码 时间复杂度为:O(n) 最直观的写法, 一个for循环求出结果,代码如下: def sample_1(x, n): result =
阅读全文
摘要:回溯算法 定义:回溯算法,又称“试探法”。解决问题时, 每一步都是尝试态度,如果发现并不是好的, 或者这么走下去很定达不到目标,立刻返回重新操作, 这种走不通就回退的方法为回溯算法。 解题一般步骤: 1、定义一个解空间, 它包含问题的解; 2、利用适合的方法组织空间解; 3、利用深度优先法搜索解空间
阅读全文
摘要:##排序算法 一、 插入排序 (有序区, 无序区) 把无序区的第一个元素插入有序区的适当位置 import random num = list() for i in range(20): num.append(random.randint(0, 100)) sorted_list = [num[0]
阅读全文
摘要:任意多边形内接圆 算法思路: 推荐 在多边形形成的二维平面区域中,高度为H,宽度为WW。将空间进行等分, 高度为n份, 宽度为m份; 在空间形成网格,将多边形区域外的点剔除掉。在剩下的点中对每个点,找到边最近的距离。在这样 很多点中找出最大距离点。以种子点为中心的区域再剖分,循环迭代。 """ #!
阅读全文
摘要:递归和尾递归 递归 1、定义: 子问题必须和原始问题相同,且更为简单; 不能无限制的调用本身,必须有个出口,化简为非递归状况处理。 2、场景: # 递归实现 def fact(n: int): """ 求n! :param n: :return: """ if n < 0: return 0 eli
阅读全文
摘要:查找 二分法查找 from time import perf_counter from typing import List def my_min(arr: List[int]): """ 二分查找法 :param arr: 已知有序数组 :return: list数列 """ length = l
阅读全文
摘要:最近最少使用算法LRU(Least Recently Used) 原理: 按照使用时间倒排序,然后从尾部删除元素。 场景: 在有限的空间中,存储对象时,当空间满时,会按一定的原则删除原有的对象, 常用的原则(算法)LRU, FIFO, LFU等。 计算机的Cache硬件,以及主存到虚拟内存的页面置换
阅读全文
摘要:递归函数的弊端 递归函数虽然编写时,使用很少的代码完成了庞大的功能,弊端非常明显--时间和空间的消耗。 eg: import time def fibonacci(n): if n < 2: return 1 else: return fibonacci(n - 1) + fibonacci(n -
阅读全文
摘要:字符换的替换 一般方法: 思路:从前向后,直接找到需要被替换的字符,进行替换 缺点: 需要移动被替换的字符其后字符,造成时间复杂度为O(n^2); 优化: 思路:从后向前,进行遍历和替换; 首先遍历,找出有多少个被替换的字符,然后计算出,替换字符后所需容器大小,使用双指针从后向前进行遍历,遇到被替换
阅读全文
摘要:动态规划 定义 动态规划(dynamic programming, 简称DP): 寻找多分支下最优解 工作原理 要解决一个复杂的问题,先解决其子问题(先解决子问题,再逐步解决大问题) 这便是典型的递归思想,eg:斐波拉切数列 应用场景 斐波拉切数列定义如下: F(0) = 1, F(1) = 1,
阅读全文
摘要:##用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队
阅读全文