-
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
-
二分法:采用两个指针,注意他们的区间划分;
-
双指针法,用于查找排序:双指针将一个两层循环转化成了一层循环,时间复杂度也从n^2变成了n,那么什么时候会需要使用双指针呢?
一般来讲,当遇到需要对一个数组进行重复遍历时,可以想到使用双指针法 -
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
- 虚拟头节点便于操作;
- 哈希表:了解熟练使用哈希表函数进行操作:,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
- 对数字的位数进行求解
while (n) {
sum += (n % 10) ;
n /= 10;
}
- 交换元素swap(s[i],s[j]);
- 反转字符:reverse(a, a+n);//n为数组中的元素个数
- 前缀表:前缀和是指某序列的前n项和;前缀和的最主要目的就是求子数组的和的大小
- 栈和队列:stack queue基本操作如下
栈的下列操作
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。 - 二叉树的遍历:迭代遍历,递归遍历,遍历顺序前中后,迭代遍历采取stack先进先出,建议递归遍历,之后还有层序遍历
- 回溯算法用于解决特定条件的匹配问题
组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等
判断一个数是质数(素数)C++
bool isprime(int num){ //判断一个数是否是素数
for(int i = 2; i * i <= num; i++){ //遍历到根号num
if(num % i == 0) //检查有无余数
return false;
}
return true;
}
时间复杂度O(sqrt(n))。