408王道数据结构强化——算法题(一)

简介: 408王道数据结构强化——算法题

1.注释以及简写

1.1.最大值——INT_MAX,最小值——INT_MIN

①找最小值初始化为MAX_INT(任何值都比它小);找最大值设置为MIN_INT(任何值都比它大)

int D_min = MAX_INT;    //将D_min初始化为int类型的最大值
for (int i = 0; i < n; i++){    //遍历数组找到数组中的最小值
    if (arr[i] < D_min) D_min = arr[i];
}
int D_max = MIN_INT;    //将D_max设置为int类型的最小值

②还有一种思路:初始化时,将arr[0]赋值给D_min

1.2.比大小函数max(a,b) min(a,b)

加注释直接用(与1.1中代码相比较)

int D_min = MAX_INT;    //将D_min初始化为INT类型的最大值
for (int i = 0; i < n; i++) {
    D_min = min(D_min, arr[i]);    //D_min = D_min和arr[i]中的较小值
}

1.3.使用CIN、COUT代替PRINTF、SCANF

cin >> A[0];
cout << A[0];

1.4.i++和++i

i++先对i进行处理,再自增;++i先自增再对i处理

1.5.交换函数swap(a,b)

①直接用,加注释

②原定义中是采用的指针方式,因此交换的是两个地址空间内的内容

if (arr[i] < arr[j]) swap(arr[i],arr[i+1]);    //arr[i] < arr[j]时,交换A[i]和A[i+1]的值
//等价于
if (arr[i] < arr[j]) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

2.复杂度

1.时间上尽可能高效→不管空间

2.时间和空间两方面都尽可能高效(等价于尽可能高效)→时间优先,空间次要

3.空间复杂度为O(1)且时间上尽可能高效→时间优先,限定空间O(1)

4.什么都没说→能做出来就行

5.只考虑递归和循环

①循环:

1f0769a5c27f4d7abdcbab405a7672f8.png5936f03d2974440fbd40232cf98cc227.png

②递归:时间复杂度为递归的层数;时间复杂度为递归的次数

a3dda946e8264b6495068ac8d7b7314b.png

3.数组

3.1.暴力求解

1.枚举:穷尽所有可能→for循环

2.对无序数组排序→快速排序

3.2.优化

1.考虑没有使用到的条件

2.过度使用条件:例如并没有要求排序的条件下却使用排序的方法做

3.考虑别的思路:

①折半算法:

(1)要求:有序(根据当前查找的结果方便下次查找);数组;一个

(2)代码实现:时间复杂度O(logn),空间复杂度O(1)

int Binary_Search(int arr[], int key, int n) {
    int low = 0, high = n - 1, mid;
    while (low <= high) {
        mid = (low + high) / 2;
        if (arr[mid == key) return mid;    //mid指向的元素和key相等,返回mid,即数组下标
        else if (arr[mid] < key) low = mid + 1;    //mid指向的元素比key小,去右半部分
        else high = mid - 1;    //mid指向的元素比key大,去左半部分
    }
    //如果数组中有和key相等的元素,则一定会在while循环中return
    //while循环结束后还没有执行return,则说明数组中没有和key相等的元素,return-1
    return -1;
}

②指针后移:要求:有序(利用有序性,当前指向的元素是各自表中的最小值,在它们中取最小值即是当前表中所有元素的最小值);多个;线性表(可以是数组,也可以是链表

③贪心算法:局部最优

④动态规划:以空间换时间,空间保存状态

4.单链表

1.不能快排,不能折半查找(没有数组随机存取的特性)

2.注意条件:空间复杂度O(1),不可以改变链表结构

3.数据结构定义:

typedef struct LNode{    //单链表
    struct LNode *next;
    int data;
}LNode, *LinkList;
typedef struct LNode{    //双链表
    struct LNode *prior, *next;
    int data;
}LNode, *LinkList;

4.注意是否有头结点

5.暴力解法:①枚举 ②利用数组保存链表元素(注意使用条件)

6.优化方向:

①前后指针:前后指针相差n个距离,同时向后移动,距离不变(查找倒数第k个)

②快慢指针:链表存在回路,走得快的指针会追上走得慢的指针

③头插法:逆置链表(从头结点后的第一个元素取,然后将该元素用头插法插入头结点后)

④数组指针后移

⑤以空间换时间(长度为n的数组)

5.树

1.递归方式实现,不用记忆非递归

2.定义:左右孩子表示法最常用8cb2bb0c0acf44d1b07b7ef8fc8e66b5.png

3.树的遍历

相关文章
|
1天前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
11 2
|
23天前
|
存储 算法 索引
算法与数据结构
算法与数据结构
26 8
|
1天前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1天前
|
算法 索引
【初阶数据结构篇】单链表算法题进阶
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。
|
1天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
27天前
|
搜索推荐 算法
【数据结构】排序算法——Lesson2
【7月更文挑战第24天】
14 3
|
4天前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
|
1月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
21 1
|
6天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列