代码编织梦想

利用数组存储元素(固定大小)实现最大堆(二叉堆)和堆排序(C++实现)-爱代码爱编程

二叉堆是一颗完全二叉树,二叉堆中某个节点的值总是不大于(小于)其父节点的值,称为最大堆(最小堆),该实现从数组下标为1开始存储元素,0位置预留不做处理,当然,完全可以从0开始存储元素,两者之间的差别就是求取某个节点的父节点、左右子节点以及最后一个非叶子节点的公式有所区别。 最大堆实现: // 利用数组存储实现堆,且从数组下标1位置开始存储元素,0

剑指offer Java版 面试题18. 删除链表的节点-爱代码爱编程

题目描述 在 O(1) 时间内删除链表节点。在给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 链表节点与函数定义如下: public class ListNode { int val; ListNode next = null; } void deleteNode(ListNode head, ListN

Java实现优化版【快速排序】+四度优化详解-爱代码爱编程

参考书目:《大话数据结构》 一:快速排序 1.基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2.核心问题:枢轴的获取。选取一个关键字,通过调整使得它左边的值都比它小,右边的值都比它大,则这样的关键字称为枢轴值(pivotkey),

不用加减乘除做加法-爱代码爱编程

一、需求 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例: 输入: a = 1, b = 1 输出: 2 提示: a, b 均可能是负数或 0 结果不会溢出 32 位整数 二、位运算 2.1  思路分析 这一看就是位运算,但问题是选择什么样的位运算来解决加法的问题呢?这里的教程非常详

刷题40-最大矩形面积-爱代码爱编程

原题链接 题目描述 给出一个只包含0和1的二维矩阵,找出最大的全部元素都是1的长方形区域, 返回该区域的面积。 示例 输入: matrix = [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输

889. 根据前序和后序遍历构造二叉树-爱代码爱编程

题目 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * }

LeetCode14. 最长公共前缀-爱代码爱编程

原题链接。 题目:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路:遍历。设置初始公共前缀字符串为字符串数组的第一个元素,将之后的元素依次与其比较,每次找出最长公共前缀。 C++实现如下: class Solution { public: string longestCommonPrefix(

C语言程序设计(数据结构)——实现单链表的各种基本运算的算法-爱代码爱编程

main.cpp //==========头文件============== #include<stdio.h> #include<stdlib.h> //=========重定义变量类型============ typedef char ElemType; typedef struct LNode { ElemType dat

python排序算法速度比较:快速排序,归并排序,冒泡排序-爱代码爱编程

  前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的看看快排在最坏的情况下(O(n²)),且不使用辅助空间,与冒泡(O(n²))的比较由于快排是不稳定的排序算法,且平均时间复杂度为O(nlogn),那找一个时间复杂度为O(nlogn)且稳定排序算法,那么

leetcode 31 下一个排列-爱代码爱编程

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。 示例 1: 输入:nums = [1,2,3] 输出:[1,3,2] 示例 2: 输入:nums = [3,2,1] 输出:[1,2,3]

106. 从中序与后序遍历序列构造二叉树-爱代码爱编程

题目 思路 后序遍历的序列的最后一个元素是根节点。根据这个根节点切割、新建数组。和前序与后序遍历序列构造二叉树类似 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * T

判断两个顶点之间是否存在路径-爱代码爱编程

此算法为“用邻接矩阵表示的深度优先搜索算法”简化版,DFS算法已在注释中标出,可进行对比。 visited数组用于记录遍历到的节点,若visited[i]=1和visite[j]=1,则i和j节点连通。IsOrNot函数和DFS函数如下 void IsOrNot(GraphMatrix *graphMatrix,int *visited,int sour

105. 从前序与中序遍历序列构造二叉树-爱代码爱编程

代码 class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder.length==0 || inorder.length==0) { return null; } //根据前序数组的第一个元素,就可以确定根节点 Tr

【数据结构】之 B 树-爱代码爱编程

B 树又叫平衡多路查找树,一个 m 阶的 B 树的特征如下: 树中每个节点至多有 m 个孩子除根节点和叶子节点外,其他每个节点至少有ceil(m / 2)(ceil(x) 是一个取上限函数) 个孩子若根节点不是叶子节点,则至少有 2 个孩子。特殊情况:没有孩子的根节点,即根节点为叶子节点,整棵树只有一个根节点所有叶子节点都出现在同一层,叶

习题3.5 求链表的倒数第m个元素-爱代码爱编程

ElementType Find(List L, int m) { int sumnumber = 0,temp=0,sum=0; List P; P = L->Next; while (P != NULL) { sumnumber++; P = P->Next;

PTA File Transfer 思路分析及代码解析-爱代码爱编程

PTA File Transfer 思路分析及代码解析v1.0 一、前导1. 需要掌握的知识2. 题目信息二、解题思路分析1. 题意理解1. 1 输入数据1.2 输出数据1.3 补充2. 思路分析(重点)三、具体实现1. 弯路和bug2. 代码框架(重点)2.1 采用的数据结构2.2 程序主体框架2.3 各分支函数3. 完整编码四、参考其他 一

优先队列的使用_LeetCode1675-爱代码爱编程

题目描述 给你一个由 n 个正整数组成的数组 nums 。 你可以对数组的任意元素执行任意次数的两类操作: 如果元素是 偶数 ,除以 2 例如,如果数组是 [1,2,3,4] ,那么你可以对最后一个元素执行此操作,使其变成 [1,2,3,2] 如果元素是 奇数 ,乘上 2 例如,如果数组是 [1,2,3,4] ,那么你可以对第一个元素执行此

lower_bound 函数的C语言实现-爱代码爱编程

题目大意:请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。样例输入:5 4 1 2 4 4 5样例输出3 #include <stdio.h> #include <stdlib.h> int a[1000005]; int main() { int

Leetcode 814. 二叉树剪枝 做题小结-爱代码爱编程

题目: 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。 返回移除了所有不包含 1 的子树的原二叉树。 ( 节点 X 的子树为 X 本身,以及所有 X 的后代。) 示例1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红色节点满足条件“所有不包含 1 的子树”。 右图为返

利用循环链表实现约瑟夫环(C++语言实现)-爱代码爱编程

问题背景: 来源于一个故事,后被改编为程序表示。 题目如下 博主为逆输出,若想得到正输出,只需改动很小的一部分就行,博主就不在这一一赘述了。 上代码! #include <iostream> #include <stack> using namespace std; typedef struct Node{ in