
算法与数据结构
数据结构与算法实现
SimpleZihao
听君一席话,如听一席话
展开
-
数据结构与算法---链表
看尚硅谷韩顺平老师课程写的记录原创 2022-01-25 15:05:54 · 631 阅读 · 0 评论 -
数据结构与算法-队列
看尚硅谷韩顺平老师课程所记原创 2022-01-23 22:16:04 · 221 阅读 · 0 评论 -
数据结构与算法-稀疏数组
看尚硅谷韩顺平老师的图解数据结构所写笔记原创 2022-01-22 14:55:44 · 236 阅读 · 0 评论 -
leetcode26题删除有序数组中重复项
问题描述给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。解题思路题目要求原地删除,即原始的创建新数组方式不可以用,此处采用双指针方式。首先判断特殊情况,如果数组为空或者元素数为0则直接返回0;如果不为0,设置left、right两个指针,左指针负责添加元素,右指针负责遍历元素。右指针在前面遍历,如果左右指针元素不一致,说明有新元素,则左指原创 2021-11-19 00:41:15 · 668 阅读 · 0 评论 -
Java数据结构与算法之归并排序
思路分析归并排序,先将数组分为两并分别使用递归排好序,再依次遍历并比较两部分元素,按顺序存入辅助数组,(一个数组遍历完则将另一个还未遍历完的数组元素直接复制到辅助数组),最后将辅助数组中所有元素复制回原数组代码实现package DataStructures;/** * 归并排序, 先将数组分为两个部分,两个部分排好序,再依次遍历并比较两部分元素,按顺序 * 存入辅助数组,(一个数组早遍历完,另一个未遍历完的数组元素直接填入辅助数组)最后将 * 辅助数组中的元素复制回原数组 */publ原创 2021-11-16 22:00:25 · 269 阅读 · 0 评论 -
Java数据结构与算法之使用递归求数组最大值
思路分析递归求解最大值,首先考虑递归终止条件,当元素只有一个数时,返回此数;不满足终止条件时,首先求数值中点,对左右两部分分别递归求最大值,最后取左右最大值中最大的一个返回代码实现package DataStructures;/** * 递归求最大值 */public class GetMax { public static int getMax(int[] arr) { return process(arr, 0, arr.length - 1); }原创 2021-11-16 20:59:22 · 991 阅读 · 0 评论 -
Java数据结构与算法之插入排序
思路分析插入排序,从数组0号索引开始,依次让0 ~ 0、0 ~ 1、0~2 … 直到0 ~ i有序。 因为0 ~ 0是有序的,所以遍历从数组索引为1的元素开始,将新遍历的元素与排好的元素最后一个开始比较大小,大的放末尾,小的继续与前面的元素比较,直到所有元素排序完毕代码实现package DataStructures;// 插入排序public class Insertion { public static int[] insertionSort(int[] arr) {原创 2021-11-16 16:21:19 · 234 阅读 · 0 评论 -
数据结构一点小记录
异或^几个性质0异或任意数结果为任意数:0^N = N两个相同数异或结果为0:N^N=0异或满足结合律、交换律:a ^ b = b ^ a ,(a ^ b)^ c = a ^ (b ^ c)原创 2021-11-16 15:05:30 · 398 阅读 · 0 评论 -
Java数据结构与算法之选择排序
思路分析选择排序,每次从待排序的元素序列中选择最大或者最小的元素,放到序列起始位置,再从剩余的元素中继续寻找,放到已排序序列的末尾代码实现package DataStructures;/* 选择排序,每次从待排序的元素序列中选择最大或者最小元素 放到序列起始位置,再从剩余元素中继续寻找,放到已排序序列的末尾 */public class Selection { public static int[] selectionSort(int[] arr) { // 如原创 2021-11-16 14:59:22 · 437 阅读 · 0 评论 -
Java数据结构与算法之冒泡排序
思路分析首先从第一个元素开始遍历,前一个与后一个进行比较,小的元素放到前面,一直到末尾,遍历可获得最大元素(最后的元素),依次遍历,直到排序完毕代码实现package DataStructures;/** * 冒泡排序,从第一个元素开始遍历,前一个与后一个比较,小的放到前面,一直到末尾,每次遍历 * 最后的元素为最大值 */public class Bubble { public static int[] bubbleSort(int[] arr) { if (ar原创 2021-11-16 14:53:40 · 486 阅读 · 0 评论 -
python数据结构与算法之贪心算法
python数据结构与算法之贪心算法算法示例:1.找零问题:假设商店老板需要找零n元钱,钱币的面额有:100元、50元、20元、5元、1元, 如何找零 使得所需钱币的数量最少?代码实现:# t需要倒序排好t = [100, 50, 20, 5, 1]def change(t, n): # n为需要找零的钱 m = [0 for _ in range(len(t))] # m存储各种面额的张数 for i, money in enumerate(t):原创 2021-04-15 20:08:57 · 169 阅读 · 2 评论 -
python数据结构与算法之二叉树
python数据结构与算法之二叉树二叉树上述图片案例的代码实现# 定义节点class BitreeNode: def __init__(self, data): self.data = data self.lchild = None # 左孩子 self.rchild = None # 右孩子a = BitreeNode('A')b = BitreeNode('B')c = BitreeNode('C')d = BitreeN原创 2021-04-15 16:30:57 · 182 阅读 · 2 评论 -
python数据结构与算法之链表
python数据结构与算法之链表创建链表头插法、尾插法class Node: def __init__(self, item): self.item = item self.next = None# 头插法def create_linklist_head(li): head = Node(li[0]) for element in li[1:]: # li[0]作为头节点,故从li[1]开始 node = Node原创 2021-04-14 18:37:12 · 305 阅读 · 2 评论 -
python 数据结构与算法之栈和队列及其应用(深度、广度优先搜索解决迷宫问题)
python数据结构与算法之栈和队列及其应用栈栈就像弹匣,先装入的子弹最后打出,后装入的子弹先打出队列队列就像排队过安检,排在前面的人先通过,排在后面的人后通过双向队列python队列内置模块python队列内置模块from collections import dequeq = deque([0, 2, 4, 6, 8], 5) # 5表示队的最大长度,如果超过队的规模,则队首元素自动出队的print(q)q.append(9) # 队尾进队print(q)pri原创 2021-04-13 22:08:12 · 318 阅读 · 0 评论 -
python数据结构与算法之计数排序
python数据结构与算法之计数排序前提:已知列表中数字取值范围思路分析建立一个长度为列表中最大值的列表count,列表count中各索引对应的初始值全为0遍历要排序的列表li , 列表的值为多少则在count对应索引里面的值+1(计数)遍历计数好的count,每个数字有几个就输出几次如下图:第七行为要排列的列表li,9到15行是对列表中个元素进行计数,第十六行是排列好输出的结果代码实现:def count_sort(li, max_count=100): # 排序的范围,默认为原创 2021-04-13 16:20:47 · 106 阅读 · 0 评论 -
python数据结构与算法之希尔排序
python数据结构与算法之希尔排序简单原理①②③④⑤import randomdef insert_sort_gap(li, gap): # gap相邻两组之间对应元素的距离 for i in range(gap, len(li)): # i表示摸到的牌的下标 tmp = li[i] j = i - gap # j指的是手里的牌的下标(如例图中的'3'和'5') while j >= 0 and li[原创 2021-04-12 22:14:25 · 116 阅读 · 0 评论 -
python数据结构与算法之归并排序
python数据结构与算法—>排序NB三人组之归并排序核心思想:分治法归并算法图片示例:归并算法的工作原理如下:第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾假设一个列表分为两段有序,将其合成为一个有序列表①②第一原创 2021-04-12 18:35:32 · 390 阅读 · 0 评论 -
python数据结构与算法之topk问题
python数据结构与算法之topk问题问题描述:现有n个数,设计算法得到前k大的数解决思路:取列表前k个元素建立一个小根堆,堆顶就是目前第k大的数依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整遍历列表所有元素后,倒序弹出堆顶代码实现import randomdef sift(li, low, high): i = low j = 2 * i + 1 tmp = li[low]原创 2021-04-12 15:17:57 · 303 阅读 · 0 评论 -
python数据结构与算法之堆排序
python数据结构与算法—>NB三人组之堆排序预备知识二叉树的顺序存储方式完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树堆:一种特殊的完全二叉树大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小堆的向下调整:当根节点的左右子树都是堆但自身不是堆时,可以通过一次向下的调整来将其变换成一个堆调整前:调整后:堆排序过程建立堆得到堆顶元素,为最大元素去掉堆原创 2021-04-11 21:07:49 · 180 阅读 · 0 评论 -
python数据结构与算法之快速排序
python数据结构与算法—>排序NB三人组之快速排序分析``时间复杂度: nlogn# 归位函数def partition(li, left, right): tmp = li[left] # 让tmp为第一个(此处可以优化) while left < right: while left < right and li[right] >= tmp: # 从右边找比tmp小的数 right -= 1 # 找不到则往左原创 2021-04-11 10:58:42 · 116 阅读 · 2 评论 -
python数据结构与算法之插入排序
python数据结构与算法之插入排序分析插入排序可理解成摸取扑克牌,0~j是手里已经有的牌,i~len(li)-1是未摸的牌,tmp指的是正在摸起的牌,摸到的牌与手里最后一张牌进行比较,如果比手里最后一张大,就放在最后面,如果比手里最后一张小,则与倒数第二张进行比较,以此类推。需要注意的是,当摸到的牌tmp比手里的牌 li[j] 大时,tmp应该放到 li[j] 后面的一位即 j+1 的位置。def insert_sort(li): for i in range(1, len(li)):原创 2021-04-10 20:48:46 · 312 阅读 · 5 评论 -
python数据结构与算法之选择排序
python数据结构与算法之选择排序分析: - 一趟排序记录最小的数,放到第一个位置 - 再一趟排序记录记录列表无序区最小的数,放到第二个位置 - ...... - 算法关键点:有序区和无序区、无序区最小数的位置def select_sort(li): # 剩下的最后一个数一定是最大的,所以len(li)-1即可 for i in range(len(li) - 1): # 第i趟 min_loc = i # 初始最小数字对应索引 for原创 2021-04-10 19:22:09 · 94 阅读 · 0 评论 -
python数据结构与算法之冒泡排序
python数据结构与算法之冒泡排序分析冒泡排序: 列表每两个相邻的数,如果前面的比后面大,则交换这两个数一趟排序完成后,无序区减少一个数,有序区增加一个数字def bubble_sort(li): for i in range(len(li) - 1): # 第i趟 for j in range(len(li) - i - 1): 指针位置 if li[j] > li[j + 1]: # 如果前一个数比后一个数大,则交换位置(小数在前原创 2021-04-10 18:47:25 · 152 阅读 · 0 评论 -
python算法与数据结构之二分查找
python算法与数据结构之二分查找温馨提示:看明白不代表掌握,最好自己亲自手写n遍。正所谓:纸上得来终觉浅,绝知此事要躬行def binary_search(li, val): left = 0 right = len(li) - 1 while left <= right: # 候选区有值 mid = (left + right) // 2 # //向下取整 if li[mid] == val: return原创 2021-04-10 18:33:43 · 119 阅读 · 2 评论 -
递归实现全排列问题
递归实现全排列问题问题描述:求n个元素的全排列思路分析:代码实现:def arrangement(data, k): if k == len(data): print(data) for i in range(k, len(data)): data[i], data[k] = data[k], data[i] arrangement(data, k + 1) # 恢复原来顺序,为了下一次排列 data原创 2021-03-28 20:58:16 · 91 阅读 · 0 评论 -
递归求解取球问题
递归求解取球问题------参考蓝桥杯教学与培训问题描述:n(n!=0)个球中,任取m个(不放回),求有多少种不同取法思路分析:若m=0(不取出)或者n=m(全部取出),则只有一种;若n<m,则返回0;当n<m时,可以假定n个球里有一个特殊的球x,我们将取法分为两种:①取的球包含x,则相当于已经取了一个x,需要再在剩下的n-1个球里面取m-1个 ②取的球不包含x,则需要在除了x之后的n-1个球里面取m个 。最后把两种方法的个数相加则为取法总数代码实现def fetch_ball(n,原创 2021-03-28 19:10:20 · 408 阅读 · 0 评论 -
递归求1到100的和
递归求1到100的和def recersive_sum(n): if n == 1: # 设置终止条件 return 1 else: return recersive_sum(n - 1) + nprint("求和结果是:", recersive_sum(100)) # 5050原创 2021-03-28 17:08:57 · 3507 阅读 · 0 评论 -
力扣练习 ------Two Sum 两数之和问题
力扣练习 ------Two Sum 两数之和问题题目要求给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]来源:力扣(LeetCode原创 2021-03-26 20:44:42 · 190 阅读 · 3 评论