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.树的遍历

相关文章
|
6天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
6天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
45 9
|
1天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
20 4
|
25天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
25 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
25天前
初步认识栈和队列
初步认识栈和队列
53 10
|
19天前
数据结构(栈与列队)
数据结构(栈与列队)
15 1