
经典算法
Android系统攻城狮
《Android系统多媒体进阶实战》一书作者
展开
-
两数之和(二十二)
题目:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。例如:遍历数组a[1,2,3,4,5,6,7,8,9,10]中两数之和等于10的,所有数的索引.//遍历数组a[1,2,3,4,5,6,7,8,9,10]中两数之和等于10的,所有数的索引.#include <iostream>#include <vector>#include <map>usin...原创 2022-05-14 12:36:30 · 209 阅读 · 0 评论 -
二叉树、红黑树(二十)
树二叉树L、D、R分别表示遍历左子树、访问根结点和遍历右子树 先序遍历:DLR 中序遍历:LDR 后序遍历:LRD 仅有前序和后序遍历,不能确定一个二叉树,必须有中序遍历的结果二叉树的性质 性质1:在二叉树中第 i 层的结点数最多为2^(i-1)(i ≥ 1) 性质2:高度为k的二叉树其结点总数最多为2^k-1( k ≥ 1) 性质3:对任意的非空二叉树 T ,如果叶结点的个数为 n0,而其度为 2 的结点数为 n2,则:n0 = n2原创 2022-05-09 00:50:11 · 325 阅读 · 0 评论 -
快速排序单步解释(十九)
快速排序给定一个序列:22 33 49 47 33' 12 68 29进行快速排序主要思想从序列中,任选一个记录k作为轴值 pivot选择策略:第一个元素最后一个元素中间元素随机选择将剩余的元素,分割成 左子序列 L 和 右子序列 RL 中所有元素都 < k, R 中所有元素都 > k对 L 和 R递归进行快排,直到子序列中有 0 个 或者 1 个元素,退出图解初始数组:选定47为轴值pivotpivot与最后一个值29进行交换(把pivo转载 2022-05-08 00:00:13 · 501 阅读 · 0 评论 -
带与不带头节点区别(十八)
●节点结构typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList;●不带头节点:此时头指针指向第一个节点 h->a1->a2->a3->…… // 头指针存放的是第一个节点的地址,即h,也就是说(*h)表示的是第一个节点 带头结点:此时头指针指向头结点 h->headnode->a1->a2->a3->…… // 头指..转载 2022-05-05 23:45:37 · 296 阅读 · 1 评论 -
const指针用法(十七)
#include <stdio.h>/* 常量指针与变量指针 *//* const int* p; //p可变,p指向的内容不可变 *//* int const* p; //p可变,p指向的内容不可变 *//* int* const p; //p不可变,p指向的内容可变 *//* const int* const p;//p和p指向的内容都不可变 *//* 口诀:左数右指 *//* 当const出现在*号左边时,指针指向的数据为常量; *//* 当const出现在*后右边时,.原创 2022-05-04 15:27:27 · 413 阅读 · 0 评论 -
六大排序原理(十六)
1.冒泡排序冒泡排序:重复从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置。在这个过程中,数字会像泡泡一样,慢慢从右边往左“浮”到序列的顶端。这个算法称之为“冒泡排序”。2.选择排序选择排序:重复从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换。3.插入排序插入排序:从右侧的未排序的区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。4.堆排序堆排序:在堆中存储所有的数据,并按降序来构建堆。从降序排列的堆中取出数据时,会从最大的数据原创 2022-04-28 15:54:43 · 849 阅读 · 0 评论 -
单、双链表的循环链表(十五)
1. 单链表的循环链表<1>.单链表的循环链表特点单链表只能向后操作,不能向前操作,如果从当前结点开始,无法访问该结点前面的结点。如果最后一个结点的指针指向头节点,形成一个闭环,就可以从任意一个节点出发,访问所有结点,这就是循环链表。<2>.单链表单链表的最后一个结点的next指针域为空。单链表为空判断:L->next = NULL;<2>.单链表循环链表单链表循环链表最后一个结点的next指针域不为空,而是指...原创 2022-04-21 19:58:41 · 1964 阅读 · 0 评论 -
双链表插入、删除操作单步解析(十四)
1.双链表定义单链表只能向后操作,不能向前操作。双链表可以向前和向后操作。双链表特点:以下图解释一个前驱指针:ai的前驱指针,指向ai-1结点,即存放ai-1的地址。数据域:存放数据一个后驱指针:ai的后驱指针,指向ai+1结点,即存放ai+1的地址。以上概念是是否能理解双向链表的关键。2.插入操作在第i个结点前面,插入一个e结点。分析:<1>.p->prior->next = s;p:表示指向ai结点的指针p-&.原创 2022-04-20 16:09:02 · 4534 阅读 · 5 评论 -
单链表插入、删除操作单步解析(十三)
1.插入操作在第i个结点前面,插入一个e结点。分析:<1>.s->next = p->next;如果想在第i个结点之前插入一个e结点,必须找到i结点前的i-1结点,在i-1结点以后插入e结点。如上图:可以看出左边为i-1结点,右边为i结点。s:表示指向e结点的指针,即e结点的地址。p:表示指向i-1结点的指针,即i-1结点的地址。s->next:表示指向e结点的s指针域存,储下一个结点的地址。p->next:指向第i个结点的指针,即原创 2022-04-20 15:20:22 · 2355 阅读 · 5 评论 -
双向链表list(十二)
List是一个双向链表,可以在常数时间内插入和删除,不支持数组表示法和随机访问。1.C++ list api说明C++之list api介绍1.定义一个双向链表first和second,类型是doublestd::list<double> first, second;2.合并双向链表first.merge(b):说明:将链表b与调用链表first合并,合并之前,两个链表必须是已经排序,合并后经过排序的链表被保存在调用链表中,b链表为空;3.链表删除结点first.re原创 2022-04-19 00:57:29 · 909 阅读 · 0 评论 -
双向链表(十一)
双向链表单链表寻找某结点的前驱结点时,必须遍历一遍链表,最坏的时间复杂度 O ( n ) O(n)O(n)而双向链表可以直接寻找某结点的前驱结点1.双向链表的某结点用指向某结点的指针p代表该结点结点p的后继的前驱等于结点p本身结点p的前驱的后继等于结点p本身p = p->prior->nextp = p->next->prior2.非空的带头结点的双向链表3.双向链表中元素的插入操作插入操作图解分步:第一步:s-&...转载 2022-04-18 23:03:30 · 2658 阅读 · 0 评论 -
队列的原理(十)
1.队列的特点 队列是一个很重要的数据结构,和栈不同的是,队列的特点是“先入先出” ;即第一个压入(push)队列的元素,出队列(pop)的时候先出来。2.入队列与出队列实现例子#include <iostream>#include <queue>using namespace std;int main (){ queue<int> myqueue; int myint; cout << "Push data to qu.原创 2022-04-13 21:21:38 · 492 阅读 · 0 评论 -
栈的原理(九)
1.栈的特点栈是一种常见的数据结构,栈的特点是“后进先出”,最后被压入(push)栈的元素,出栈的时候会被第一个弹出来(pop)。2.入栈与出栈实现例子#include <iostream>#include <stack>using namespace std;int main (){ stack<int> mystack; cout << "Push data to stack:"; for(int i=0; i<原创 2022-04-13 21:12:38 · 545 阅读 · 0 评论 -
二叉树前序、中序、后序遍历(八)
1.树的特征定义:<1>.树是一种数据结构,除根节点之外,每个节点只有一个父节点,根节点没有父节点;<2>.除叶节点之外,所有节点都有一个或者多个子节点,叶节点没有子节点<3>.父节点和子节点之间用指着连接。2.大部分时候提到的树,是指二叉树;二叉树是树的一种特殊结构,二叉树中每个节点最多只能有两个子节点. 二叉树排序例子 <1>...原创 2022-04-11 21:32:36 · 1466 阅读 · 0 评论 -
递归原理(七)
递归定义:先往下一层层传递,当碰到终止条件的时候会反弹,最终会反弹到调用处。我们求f(5)的时候,只需要求出f(4)即可,如果求f(4)我们要求出f(3)……,一层一层的调用,当n=1的时候,我们直接返回1,然后再一层一层的返回,直到返回f(5)为止。#include <stdio.h>int fun(int k){ //1.从外层到内,层层传递解方程 printf("line = %d, k = %d\n",__LINE__,k); if(k == 0) .原创 2022-04-09 23:08:19 · 726 阅读 · 0 评论 -
从尾到头打印链表(六)
// 6:从尾到头打印链表// 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。#include<iostream>#include<stack>using namespace std;struct ListNode{ int m_nValue; ListNode * m_pNext;};//建立带头结点的空单链表void InitList(ListNode **L) { *L = (ListNode*)malloc(sizeof(List.原创 2022-03-01 18:11:30 · 474 阅读 · 0 评论 -
替换空格(五)
题5:替换空格题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。#include <cstdio>#include <cstring>/*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/void ReplaceBlank(char str[], int length){ if(str == nullptr && leng.原创 2022-02-16 19:53:31 · 162 阅读 · 0 评论 -
指针与指针指向的内容(四)
#include <stdio.h>int main(){ char *str1 = (char*)malloc(4 * sizeof(char)); char *str2 = (char*)malloc(4 * sizeof(char)); //1.指针str2指向str1首地址,改变str2的指向,就能改变str1的指向.#if 0 str2 = str1; memcpy(str2,"55555",4); printf("str1 = %s, str2 = %s\n".原创 2022-02-16 18:38:23 · 635 阅读 · 0 评论 -
字符串赋值数组和指针内存的区别(三)
#include <stdio.h>int main(){ char str1[] = "hello world"; char str2[] = "hello world"; char *str3 = "hello world"; char *str4 = "hello world"; if(str1 == str2) printf("str1 == str2 \n"); else printf("str1 != str2 \n"); if(str3 == s.原创 2022-02-16 17:08:35 · 573 阅读 · 0 评论 -
查找数组中重复数字 (二)
#include <iostream>#include <string.h>using namespace std;void FindRepeatNum(int *arr, int len){ int i = 0, j = 0; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] == arr[j]) printf("%d ",arr[i]); } }.原创 2022-02-16 16:44:07 · 536 阅读 · 0 评论 -
数组中间索引(一)
#include <stdio.h>int pivotIndex(int* nums, int numsSize){ int numright = 0,numleft = 0; for(int p = 0; p <numsSize;p++){ numleft+=nums[p]; } for(int n = 0;n<numsSize;n++){ numleft = numleft - nums[n]; .原创 2022-01-18 18:19:05 · 231 阅读 · 0 评论 -
算法复杂度O(1),O(n),O(logn),O(nlogn)的区别
算法复杂度分为时间复杂度和空间复杂度:时间复杂度是指执行这个算法所需要的计算工作量 空间复杂度是指执行这个算法所需要的内存空间1.对于一个循环,假设循环体的时间复杂度为 O(n),循环次数为 n,则这个循环的时间复杂度为 O(n×1)。void aFunc(int n) { for(int i = 0; i < n; i++) { // 循环次数为 n printf("Hello, World!\n"); // 循环体时间复杂度为 O(转载 2022-01-06 23:18:06 · 1397 阅读 · 0 评论 -
二分查找时间复杂度分析
主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。二分查找分析:二分查找每次排除掉一半的不适合值,所以对于N个元素的情况:一次二分剩下:N/2两次二分剩下:N/2/2 = n/4三次二分查找剩下:N/2/2/2 = N/8...原创 2020-01-20 10:51:52 · 2600 阅读 · 0 评论 -
平衡二叉树(AVL树)和红黑树区别
1.二叉搜索树,平衡二叉树,红黑树的算法效率操作 二叉查找树 平衡二叉树 红黑树查找 O(n) O(logn) O(log2 n)插入 O(n) O(logn) O(log2 n)删除 O(n) O(logn) O(log2 n)Olog(n)怎么算出来的?在一个树中查找一个数字,第一次在根节点判断,第二次在第二层节点判断,以此类推,树的高度是多少就会...原创 2020-01-03 19:24:12 · 488 阅读 · 0 评论 -
三分钟看懂红黑树
一、在理解红黑树之前,先看一些二叉查找树二叉查找树特性:左字数上所有的节点的值都小于或等于他的根节点上的值 右子树上所有节点的值均大于或等于他的根节点的值 左、右子树也跟别为平衡二叉树 举个二叉树的例子: 可以看到如果要...转载 2020-01-03 18:00:22 · 261 阅读 · 0 评论 -
程序员内功:八大排序算法
原址摘要如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。一、前言如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。二、八大排序算法排序算法作为数据结构的重要部分,系统地学习一下是很有必要的。1、排序的概...转载 2018-10-13 14:25:53 · 381 阅读 · 0 评论 -
单向链表反转(逆置)
参考#include <iostream>using namespace std;class List {public: //节点结构 struct Node{ int data; Node * next; Node(const int& d):data(d),next(NULL){} }; Node *head;//头节点...原创 2019-03-25 17:13:39 · 479 阅读 · 0 评论 -
单链表定义
单链表1、链接存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的...转载 2016-06-15 15:55:33 · 1392 阅读 · 0 评论 -
递归的本质(栈:后进先出)
栈:就是后进先出的一种数据结构,所谓的后进先出就是:后入栈变量数据,先出栈计算处理.递归:与栈类似,递归到最内层(到退出条件),开始从内层向外逐层调用函数自己计算处理.帮助理解递归,写一个阶乘函数factorial(4) = 4 * factorial(3) = 4 * (3 * factorial(2) ) =...原创 2019-03-26 20:43:19 · 2917 阅读 · 0 评论 -
单链表头插法和尾插法
#include <iostream>using namespace std;class List{public: List(){create_List();} ~List(){} void create_List(); void insert_head(const int &d); void insert_end(const int &d)...原创 2019-03-24 00:08:34 · 9893 阅读 · 0 评论 -
双向链表尾插法(二)
参考#include <iostream>using namespace std;typedef struct Node pNode;struct Node{ int data; pNode *prev,*next; Node(const int& d):data(d),prev(NULL),next(NULL){} };/* 初始化...原创 2019-03-29 00:39:42 · 3641 阅读 · 1 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字转载 2016-09-10 23:41:19 · 397 阅读 · 0 评论