文章目录
第九天
第一天学习数据结构,也看了书,也找了网课,最后还是决定用网课了,感觉去嗯看书的话,不太好搞,就看网课+例题练习把,以后每一天的更新都会是这种形式,简单介绍一下今日学的数据结构类型或者什么算法,后面加上习题,还有记录下自己的一点理解。
1.数组
数组就不多说了,cpp里面简单的定义就是
int a[100];
数组一些操作的时间复杂度
在头和尾插入的操作的复杂度肯定是1,但是对于插入和删除,数组必须要找到元素以后,插入操作需要将它后面的元素都往后挪一位,删除的操作是将其后面的元素都向前挪一位。
数组练习
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
链接:https://leetcode-cn.com/problems/move-zeroes
int j = 0;
for (int i = 0; i < nums.size(); i++){
if (nums[i] != 0){
nums[j] = nums[i];
if (i != j){
nums[i] = 0;
}
j++;
}
}//双指针方法
盛水的容器
输入:[1,8,6,2,5,4,8,3,7]
输出:49
int maxArea(vector<int>& height) {
int max = 0;
for (int i = 0; i < height.size() - 1; i++){
for (int j = i + 1; j < height.size(); j++){
int area = (j - i) * (height[j] > height[i] ? height[i] : height[j]);
if (area > max) max = area;
}
}
return max;
}//暴力解法
int maxArea(vector<int>& height) {
int max = 0;
int i = 0, j = height.size() - 1;
while(i < j){
int area = (j - i) * (height[j] > height[i] ? height[i++] : height[j--]);
if (area > max) max = area;
}
return max;
}//双指针
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
这个题目简单的解释一下,用递归来看是最好做的,如果说有n级台阶的话,能到到达n级台阶只有两种方法,一种是从(n-1)级台阶一步上来,一种是从(n-2)级台阶两步上来,很容易得到公式
f
(
x
)
=
f
(
x
−
1
)
+
f
(
x
−
2
)
f(x)=f(x−1)+f(x−2)
f(x)=f(x−1)+f(x−2)
递归的实现就不说了,但是在这里会超时,要换一种方法
class Solution {
public:
int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q; //从这里开始上台阶,1->1
q = r; //1->2
r = p + q;//二者加起来,一共一种
}
return r;
}
};
上述代码跟递归的思想基本一致
2.链表
对于链表这种:
一般的链表是里面有一个值(也就是一个元素),而且还有一个指针,这个指针又指向下一个元素,下一个也是如此,但是要注意的是最后一块的指针指向的null,就是空值,第一个指针就是头指针,最后一个就是尾指针。假如说是只有一个,就叫做单链表,某些链表不单单是往后指,还要往前指,我们称之为双向链表。
linked list的新节点的添加
前面一个链表的指针指过来,新的链表的指针指过去
linked list 节点的删除
只需要将指针指向要删除的链表所指向的下一个元素跳过去即可
double linked list双向列表
多了一个指针,prev,先前指针,指向前一个值,对于头节点和尾节点指向null,如果说尾节点指向了头节点,那就形成了一个环状列表了
linked list的时间复杂度
可以看出来,在头添加一个新的元素、尾添加一个元素以及插入和删除一个元素的时间复杂度都很低,但是对于查找来说,他的时间复杂度就高了,因为在链表的操作里,查找一个元素必须要从头开始,所以时间复杂度就是O(n)
所以说并没有很完美的数据结构。
3.跳表
对于一般的链表来说,他们的缺点就是查找必须从头开始,调表可以从一定程度上弥补一个缺陷。
假如说我要去找7这个元素,我要走4步,但是如果说我从第一级索引去完成,我只需要1->4->7,两步就可以完成
下面是复杂一点的例子
如果去找62这个元素,就可以看到他的方便性了
在跳表中,查找的时间复杂度就可以看出来了,类似于二分查找,但是肯定是不一样的,时间复杂度为O(logn)。
今天就先写这么多把,习题我做的也不多,主要是白天先看的书,书上只是一直在教我如何调用如何调用,对于一些基本的原理,不是很能理解,简单来说不是我这个水平看的,所以就找了网课
今天决定好了学习方法,后面应该会快一点,链表和跳表类的题目到明天再补上