算法
齐心99
这个作者很懒,什么都没留下…
展开
-
删除k个数字后的最小值
问题描述:给出一个整数,从该整数中去掉K个数字,要求剩下的数字形成的新整数尽可能小。问题分解:转化为先去掉一个数字问题。删除的不仅仅是最大的数字,而且是删除高位的数字。如何把高位的数字降低呢?把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右边的数字,那么删除该数字,因为右面的大数字顶替小数字位置,新整数值变小。def remove_k_digits(num, k): for i in range(0, k): has_cut = False # 从左向右遍历,找到比自己右侧原创 2022-04-08 11:05:17 · 263 阅读 · 1 评论 -
全排列的下一个数
全排列1.从后查看逆序区域,找到逆序区域的前一位,也即是数字交换的边界2.让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置3.把原来的逆序区域转为顺序状态举例 1 2 4 5 3找到逆序区域边界 5交换 3 和5,得1 2 5 4 3(交换的是逆序区域里面大于交换数****4 并且是最小,所以是5)逆转逆序区域 得 125 3 4def find_nearest_number(numbers = []): # 1.从后查看逆序区域,找到逆序区域的前一位,也即是数字交换的边原创 2022-04-06 16:23:57 · 447 阅读 · 0 评论 -
无序数组排序后的最大相邻差
无序数组排序后的最大相邻差暴力:排序后,循环求差值“”"利用桶排序思想完成:原数组长度 n = len(array),一个桶代表一个区间范围区间跨度:(max - min )/ (n - 1)1.创建n个桶2.遍历原数组,循环插入对应桶,记录每一个桶的最大值和最小值3.遍历所有的桶,统计每一个桶的最大值和此桶右侧非空桶的最小值,求二者差,数组最大即为无序数组排序后的最大相邻差“”"class Bucket: def __init__(self): self.min = None原创 2022-04-05 20:13:27 · 292 阅读 · 0 评论 -
位运算总结
位运算位运算0&0=0 0&1=0 1&0=0 1&1=1& 与 两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或 两个位相同为0,相异为1取反 0变1,1变0<< 左移 各二进位全部左移若干位,高位丢弃,低位补0右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)判断一个数是否是2的整数次幂# 是否是2的整数次幂d原创 2022-04-05 18:05:54 · 716 阅读 · 0 评论 -
最大公约数
最大公约数辗转相除法,俩个整数a和b, a%b = ca,b最大公约数就等于 b,c最大公约数def get_largest_common2(a, b): big = max(a, b) small = min(a, b) if big % small == 0: i += 1 return small return get_largest_common2(big % small, small)print(get_largest_common2(100,45))# 暴原创 2022-04-05 15:09:50 · 72 阅读 · 0 评论 -
最小栈,俩栈实现,辅助栈保持当前最小值
最小栈,俩栈实现,辅助栈保持当前最小值push 进栈: 首元素默认为最小栈。从第二个元素开始比较,看条件辅助栈进栈 (辅助栈进栈条件)若辅助栈为空,或新元素的值小于或等于辅助栈的栈顶元素的值,则压入辅助栈pop 出栈: 原先栈直接出栈,辅助栈看条件是否出栈 (辅助栈)如果出栈元素和辅助栈元素相等,辅助栈元素也出栈get_min 获得栈最小值:若栈空,则返回空,否则直接返回辅助站数组最后一个元素注意:pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。cl原创 2022-04-05 11:21:26 · 98 阅读 · 0 评论 -
判断链表是否有环
判断链表是否有环方法:创建俩个指针p1, p2,一个一次移动一个节点,一个一次移动俩个节点,比较俩个指针指向的节点是否相同,相同则有环。求环的长度?俩个指针相遇,证明有环,此时可以让慢指针回到头节点,继续循环前进,统计循环次数,直到俩个指针第二次相遇,此时统计出来的就是环的长度。因为俩个指针的速度差是一步,当俩个指针再次相遇时, P2比P1多走了一圈(或者采取代码中的方法)求出入环节点?把其中一个指针放回到头节点,另一个指针保持在首次相遇的位置,俩个指针每次都向前走一步,最终相遇的节点就是入环节原创 2022-04-04 21:57:53 · 108 阅读 · 0 评论 -
python实现 排序算法
各种排序算法O(n2)——————————————————————————————冒泡排序,稳定排序每一轮都要遍历所有元素,总共遍历(元素数量 - 1)轮# 冒泡排序,最大的冒泡上去,最后元素最大def bubble_sort1(array = []): for i in range(len(array) - 1): for j in range(len(array) - i - 1): if array[j] > array[j + 1]: temp = arra原创 2022-03-30 19:46:41 · 337 阅读 · 0 评论 -
最大优先队列
最大优先队列无论入队顺序如何,都是当前最大元素优先出队最大二叉堆实现最大优先队列每一次入队操作就是堆的插入操作每一次出队操作就是删除堆顶节点代码class PriortyQueue:# 最大优先队列,最大二叉堆,堆顶是整个堆中的最大元素 def __init__(self): self.array = [] self.size = 0 def enqueue(self,element): self.array.append(element) self.size += 1原创 2022-03-28 15:53:36 · 281 阅读 · 0 评论 -
二叉堆的构建
二叉堆的构建对于二叉堆,有三种操作插入节点,插入是节点上升,数组的最后一个叶子节点删除节点,删除是节点下沉意思是删除的是栈顶的节点,从头开始下沉。为了维持完全二叉树结构,会把堆的最后一个节点临时补到原来栈顶的位置构建二叉堆本职是所有非叶子节点依次下沉第一个非叶子节点 下标计算:(len(array) - 2 ) // 2关于代码优化部分,# 无需真正交换,单向赋值即可是指的对于插入,上浮,循环每次只更新孩子节点,最终确定的父节点最后循环后赋值,这个赋值是在循环开始之前:用一个temp 保原创 2022-03-28 11:09:02 · 589 阅读 · 0 评论 -
python:剑指 Offer 07. 重建二叉树
python:剑指 Offer 07. 重建二叉树根据前序遍历和中序遍历 输出根节点 示例输入:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]Input: preorder = [-1], inorder = [-1]Output: [-1]...原创 2022-03-28 10:54:33 · 99 阅读 · 0 评论 -
python 剑指 Offer 06. 从尾到头打印链表
python 剑指 Offer 06. 从尾到头打印链表用栈实现,先进后出python 感觉没啥意义,列表栈直接循环添加,然后倒序输出用到倒序输出的一个技巧 list[::-1]stack[::-1]# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass S原创 2022-03-24 19:30:34 · 1373 阅读 · 0 评论 -
python 递归实现树的三种遍历
python 递归实现书的三种遍历class TreeNode: def __init__(self,data): self.data = data self.left = None self.right = Nonedef create_binary_tree(input_list = []): """ 构建二叉树 param input_list:输入数列 返回根节点 node """ if input_list is None or len(input_list) ==原创 2022-03-24 09:58:16 · 2354 阅读 · 0 评论 -
python实现一个队列
python实现一个队列队尾指针指向的位置永远空出1位,所以队列的最大容量比数组长度小1进队 队满条件 :(self.rear + 1) % len(self.list) == self.front出队 队满条件:self.rear == self.frontclass MyQueue: def __init__(self,capacity): self.list = [None] * capacity self.front = 0 self.rear = 0 def enqueu原创 2022-03-23 21:09:53 · 848 阅读 · 0 评论 -
链表各种操作
链表各种操作# 定义节点Nodeclass Node: def __init__(self,data): self.data = data self.next = Node# 初始化链表class LinkedList(object): def __init__(self): self.size = 0 self.head = Node self.last = Node # 找到index节点,返回P def get(self,index): if index &原创 2022-03-23 20:42:11 · 95 阅读 · 0 评论 -
python:剑指 Offer 05. 替换空格
python:剑指 Offer 05. 替换空格先扩容,然后移动 # 原有空间上遇到空格就添加两个空格 # 设置俩个指针,一个指针指向新数组结尾 # 另一个指向旧数组结尾 # 意思是 从后往前复制,遇到空格替换为"%20"c++class Solution {public: string replaceSpace(string s) { int length = s.size(); for( int i = 0; i &原创 2022-03-23 09:24:24 · 1646 阅读 · 0 评论 -
剑指 Offer 04. 二维有序数组中的查找
剑指 Offer 04. 二维数组中的查找class Solution(object): def findNumberIn2DArray(self, matrix, target): # 数组的特征是向靠右和靠下数字越大 # 从二维数组左下角开始判断 上还是右 # i >= 0上到头 # j < len(matrix[0]) 最右边 i, j = len(matrix) - 1, 0 wh原创 2022-03-23 08:51:19 · 105 阅读 · 0 评论 -
python:剑指 Offer 03. 数组中重复的数字
python:剑指 Offer 03. 数组中重复的数字class Solution(object): def findRepeatNumber(self, nums):# 下标和value 一一对应,如果不对应就交换,# 发现一个值对应俩个下标就说明发现重复元素了,直接输出就可以了# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,# 同时列出数据和数据下标,一般用在 for 循环当中。 for i, num in原创 2022-03-22 21:40:04 · 461 阅读 · 0 评论 -
python:剑指 Offer 09. 用两个栈实现队列
python:剑指 Offer 09. 用两个栈实现队列class CQueue: def __init__(self): self.stk_in = [] self.stk_out = [] def appendTail(self, value: int) -> None: self.stk_in.append(value) def deleteHead(self) -> int: # 俩个if 顺原创 2022-03-22 21:11:43 · 240 阅读 · 0 评论