赞
踩
定义的数据占用多少空间就是空间复杂度
O(n)
O(n^2)
真题1
真题2
真题3
真题4
真题(如下的O小于平均时间复杂度所以错误)
真题1
真题2
真题3
真题4
真题5
真题6
也就相当于一个数组,所以可以直接通过下边快速查询到表中的元素,所以效率高,但是插入和删除会批量移动,所以效率低,简称查询高效率,插删低效率
1、插入元素的代码和时间复杂度
2、删除元素的代码和时间复杂度
3、查找元素的代码和时间复杂度
时间复杂度为O(1),因为这是直接根据数组下边就可以快速查询到对应的元素
1、插入元素的代码和时间复杂度
2、删除元素的代码和时间复杂度
3、查找元素的代码和时间复杂度
真题1(一般没有问最好或者最坏的时间复杂度那就是默认为平均复杂度)
真题2
删除是要找到删除结点的前面一个结点的位置,循环单链表删除是要找到前面一个结点的位置,也就是要遍历链表,但是插入到尾结点后面就不用遍历直接插入就行
真题3
真题4
真题5
真题6
真题7
真题8
真题1
真题2
真题3
真题4(必须先进入abcd,e看情况进入:decba - dceba - dcbea - dcbae)
真题5
真题6
真题7
真题1
真题2
真题3(这题和题1一样,这里用代入求出答案)
真题4
真题5
真题6
真题7
真题8
真题1
真题2(出栈序列有多种,出队和入队序列一定一样)
真题3
真题4
真题5
真题6
真题1
真题2
真题1
真题2(最长相等前后缀+1)
例如abaab,最长相等前后缀是ab,那么就是2+1=3
例如abaaaba,最长相等前后缀是aba,那么就是3+1=4
真题3
a:求 “空” 也就是0
aa:求a也就是 0 + 1 = 1
aaa:求aa也就是1+1=2
aaab:求aaa也就是2+1=3
aaaba:求aaab也就是0+1=1
aaabaa:求aaaba也就是1+1=2
aaabaaa:求aaabaa也就是2+1=3
真题1
真题2
真题3
真题1
真题2
真题3
真题4
真题5
真题1
真题2
真题1
真题2(二叉树性质3:度0的节点等于度2的节点+1)
真题3
真题4
真题5
真题6
真题7
1、顺序存储
2、链式存储
真题1
真题2
真题3
真题4
1、先+中
真题1
真题2
真题3
真题4
真题5
真题6
真题1
真题2
真题3
真题4
真题5
1、定义
2、构造哈夫曼树
3、概念
4、规范化构造
26个字符可用 2n>=26 n=5位二进制串表示
真题1
叶子节点有n个,度为0的节点数=度为2的节点数+1
节点总数=0度节点数+2度节点数=n+n-1=2n-1
真题2
真题3
真题4
真题5
真题6
真题7
真题8
真题9
真题10
真题1
真题2
真题3
可以是非直接路径比如下图1-4可以通过1-3-4,这样求出来的就是最少
真题1
真题2
真题1
真题2
真题3
真题4
1、深度优先搜索(DFS)
1111
2、广度优先(BFS)
真题1
真题2
真题3
真题4
真题5
真题6
真题1
真题2
真题3
真题4
真题1
真题2
真题3
真题4
真题5
真题6
真题8
真题9
真题10
真题11
真题12
哈希表表长一般为不大于散列函数且最接近散列函数的质数
真题1
真题2
真题3
真题4
真题5
真题6
真题7
真题1
真题2
真题3
适用于序列基本上有序
无法归位(元素位置在下一轮可能改变)
public static void insertionSort(int[] arr) {
// 待插入的数为从下标为1开始,因为先把下标为0的固定住了
for (int i = 1; i < arr.length; i++) {
// 循环与前面的有序序列的每个值进行比较,若有序序列的下标小于0则中断循环
for (int j = i - 1; j >= 0; j -= 1) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
{2,1,5,3,7,3,1,3}
){1,1,2,4,5,8,6}
)
public static void shellSort(int[] arr) {
for (int step = arr.length / 2; step > 0; step /= 2) {
//核心代码就是插入排序,把所有的一替换成step
for (int i = step; i < arr.length; i++) {
for (int j = i - step; j >= 0; j -= step) {
if (arr[j] > arr[j + step]) {
int temp = arr[j];
arr[j] = arr[j + step];
arr[j + step] = temp;
}
}
}
}
}
真题1
真题2
真题3
真题4
public static void selectionSort(int[] arr) {
// 5个元素只需要选择4次,因为最后一个默认为最大的
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
// 从第二个元素开始比较,找出最小值下标
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
}
大顶堆:将堆顶元素取出作为序列最大值,将堆底元素提到堆顶,在进行一次调整堆,将75作为第二大值。。。(产生递增序列,小顶堆则产生递减序列)
真题1
真题2
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 首元素为基准值
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, pivot = arr[i];
while (i < j) {
// 从右开始找比基准值小的元素
while (i < j && arr[j] >= pivot) j--;
// 将该元素放在最左侧
arr[i] = arr[j];
// 从左开始找比基准值大的元素
while (i < j && arr[i] <= pivot) i++;
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
空间复杂度是log2n
真题1
真题2
真题3
真题4
// 分+合 默认值
public static void mergeSort(int[] arr) {
mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
}
// 分+合
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
// 向左分解
mergeSort(arr, left, mid, temp);
// 向右分解
mergeSort(arr, mid + 1, right, temp);
// 合并
merge(arr, left, mid, right, temp);
}
}
// 治
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left; // 左边序列初始索引
int j = mid + 1; // 右边序列初始索引
int t = 0; // temp数组的当前索引
// 1)先把左右序列按顺序填充到temp数组,直到左右序列有一方处理完毕
while (i <= mid && j <= right) {
// 如果左序列的值小于右序列则进行存放并将左序列指针右移
if (arr[i] < arr[j]) {
temp[t] = arr[i];
t++;
i++;
} else { // 如果右序列的值小于等于左序列则进行存放并将右序列指针右移
temp[t] = arr[j];
t++;
j++;
}
}
// 2)把有剩余数据的一边序列全部填充到temp
// 如果左边还有剩余
while (i <= mid) {
temp[t] = arr[i];
t++;
i++;
}
// 如果右边还有剩余
while (j <= right) {
temp[t] = arr[j];
t++;
j++;
}
// 3)将temp数组的元素拷贝回arr
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
真题1
真题2
真题3
真题4
真题5
真题6
真题7
真题8
真题1
真题2
真题3
真题4
真题5
真题6
真题7
真题8
真题9
public class NTest {
public static void main(String[] args) {
queen();
}
static int N = 4;
static int[] q = new int[N + 1];
static int answer = 0; // 方案数
// 检查放入的皇后是否合法
public static boolean check(int j) {
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
return false;
}
}
return true;
}
public static void queen() {
// 初始化棋盘
for (int i = 1; i <= N; i++) {
q[i] = 0;
}
int j = 1; // 表示摆放第 j 个皇后
while (j >= 1) { // 防止回溯时溢出
// 让该皇后按列摆放
q[j] = q[j] + 1;
// 判断皇后位置是否合法且不越界
while (q[j] <= N && !check(j)) {
q[j] = q[j] + 1; // 不合法就往下一个位置摆放
}
if (q[j] <= N) {
// 第j个找到合法位置
if (j == N) { // 找到一组解
answer++;
System.out.print("方案" + answer + ": ");
for (int i = 1; i < q.length; i++) {
System.out.print(q[i] + " ");
}
System.out.println();
} else { // 继续摆放
j = j + 1;
}
} else {
// 还原第j个皇后的位置
q[j] = 0;
// 第j个找不到合法位置,回溯到上一个皇后的位置
j = j - 1;
}
}
}
}
方案1: 2 4 1 3
方案2: 3 1 4 2
大概的意思就是如下三图,对递归不了解的再去查查资料
(1 2 3 4) (1 2 3) (1 2 3 4) ?
(1 2 3 4) (1 2 3 4)
(1 2 3 4) (1 2 3 4)(1 2) ?
public class NTest02 {
public static void main(String[] args) {
queen(1);
}
static int N = 4;
static int[] q = new int[N + 1];
static int answer = 0;
// 检查放入的皇后是否合法 (true 合法 | false 不合法)
public static boolean check(int j) {
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
return false;
}
}
return true;
}
// 打印解决方案
public static void answer() {
answer++;
System.out.print("方案" + answer + ": ");
for (int k = 1; k < q.length; k++) {
System.out.print(q[k] + " ");
}
System.out.println();
}
// 放入皇后
public static void queen(int j) {
for (int i = 1; i <= N; i++) {
q[j] = i; // 每行都循环按列摆放
if (check(j)) { // 不冲突则检查是否摆放完成,否则摆放下一个
if (j == N) { // 摆放完成
answer();
} else { // 摆放下一个
queen(j + 1);
}
}
}
}
}
真题1
真题2
真题3
真题1
真题2
真题3
真题4
真题1
真题2
时空间复杂度O(N x W)
public class Plan {
public static void main(String[] args) {
int N = 4; // 物品数量
int W = 5; // 背包容量
int[] v = {0, 2, 4, 5, 6}; // 物品价值数组
int[] w = {0, 1, 2, 3, 4}; // 物品重量数组
int[][] f = new int[N + 1][W + 1]; // 子问题解数组
for (int i = 1; i <= N; i++) { // 物品编号
for (int j = 1; j <= W; j++) { // 背包容量
if (j >= w[i]) { // 选择当前物品
// (上一个物品的最优解) 比较 (当前物品价值+剩余容量在上一个物品的最优解)
f[i][j] = Math.max(f[i - 1][j], v[i] + f[i - 1][j - w[i]]);
} else { // 不选择当前物品
// 直接使用上一个物品的最优解
f[i][j] = f[i - 1][j];
}
}
}
System.out.println("最优解:" + f[N][W]);
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= W; j++) {
System.out.printf("%d", f[i][j]);
System.out.print(" ");
}
System.out.println();
}
}
}
真题1
真题2
真题3
真题4
真题5
真题6
真题7
真题1
解析
官方解析
真题1
真题2
真题3
真题4
真题1
真题2
真题3
真题4
真题5
真题6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。