数据结构与算法
文章平均质量分 62
算法笔记
airyv
一名兴趣使然学习编程的学生。
展开
-
【C语言】数据结构:数组,链表,栈,队列,树
3 线性结构3.1 【数组】连续存储1、什么叫做数组 元素类型相同,大小相等(数组传参,只要传进去首地址和长度就行)2、数组的优缺点(相对于链表): 优点: 存取速度快 缺点: 事先必须知道数组的长度 插入删除元素很慢 空间通常是有限制的 需要大块连续的内存块 插入删除元素的效率很低定义一个数组至少需要3个参数:首地址,长度,有效个数。用指针自己定义一个数组:# include <stdio.h># include <malloc.h>原创 2021-12-19 17:36:19 · 2571 阅读 · 0 评论 -
【C语言】数据结构预备知识,指针,数组,结构体,动态内存分配与释放
1 数据结构概述(教材:严蔚敏、吴伟民,该书程序是伪算法具体的程序是高一凡)学完数据结构之后会对面向过程的函数有一个更深的了解。1.1 定义我们如何把现实中大量而复杂的问题以特定的数据类型(单个数据怎样存储?)和特定的存储结构(个体的关系)存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法。(比如班里有15个人,其信息量也许一个数组就搞定了,但是假如10000个,怎么办?内存也许没有这么多连续的空间,所以原创 2021-12-19 16:58:14 · 1926 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路分析题目要求输出旋转数组的最小元素,比较简单的方法是使用逐个查找及直接排序,但是排序数组的查找,采用二分法会更好。逐个查找:class Solution {原创 2021-01-09 14:19:21 · 46 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点 Java版 题目分析及思路
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5原创 2020-10-26 09:51:55 · 162 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]*k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×原创 2021-01-10 15:55:19 · 71 阅读 · 0 评论 -
剑指 Offer 24. 反转链表 Java版
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000思路一:指针public ListNode reverseList(ListNode head) { //初始设定 ListNode pre = null; List原创 2020-10-26 11:34:52 · 56 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 Java版 题目及解题思路
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释: 节点 2 和节原创 2020-10-26 21:06:33 · 59 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像 Java版 题目及思路分析
请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 10原创 2020-10-26 17:53:12 · 83 阅读 · 0 评论 -
LeetCode刷题总结:贪心算法 Java实现
定义贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。455. Assign Cookies分配饼干 (Easy)Assume you are an awesome parent and want to give your children some cookies. But, you should giv原创 2021-05-16 18:28:02 · 358 阅读 · 2 评论 -
剑指 Offer 28. 对称的二叉树 Java版 题目及思路分析
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2原创 2020-10-26 20:25:26 · 50 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1原创 2021-01-10 16:49:54 · 51 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度 Java版 题目及思路分析
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。提示:节点总数 <= 10000思路:后续遍历树的后序遍历 / 深度优先搜索往往利用递归或栈实现,本文使用递归实现。原创 2020-10-27 11:01:17 · 49 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树 Java版
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1原创 2020-10-27 11:06:53 · 62 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先 Java版
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1原创 2020-10-26 21:54:37 · 70 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构 Java版 题目及思路分析
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]原创 2020-10-26 16:29:29 · 96 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制 Java版 题目及思路分析
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]采用HashMap解决。每一个结点的值用HashMap复制,然后处理新复制链表的两种关系,一个是next的指向关系,一个是rando原创 2020-10-26 14:59:46 · 120 阅读 · 0 评论 -
剑指offer 07. 重建二叉树 Java版 题目分析及思路
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \9 20 / \ 15 7思路一:递归先序遍历:根节点→左子树→右子树。中序遍历:左子树→根节点→右子树。后续遍历:左子树→右子树→根节点。构建前序遍历数组preorder和中序原创 2020-10-25 20:00:27 · 112 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配 Java版
请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p = “a*”输出: true解释: 因为原创 2021-07-03 14:31:13 · 122 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25说明:-100.0 < x < 100.0n原创 2021-01-10 23:15:00 · 58 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一原创 2021-01-09 16:43:41 · 47 阅读 · 1 评论 -
剑指 Offer 13. 机器人的运动范围
题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:原创 2021-01-10 14:02:09 · 48 阅读 · 0 评论