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.只考虑递归和循环
①循环:
②递归:时间复杂度为递归的层数;时间复杂度为递归的次数
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.定义:左右孩子表示法最常用
3.树的遍历