2021-10-09

第九天

第一天学习数据结构,也看了书,也找了网课,最后还是决定用网课了,感觉去嗯看书的话,不太好搞,就看网课+例题练习把,以后每一天的更新都会是这种形式,简单介绍一下今日学的数据结构类型或者什么算法,后面加上习题,还有记录下自己的一点理解。

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(x1)+f(x2)
递归的实现就不说了,但是在这里会超时,要换一种方法

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)。

今天就先写这么多把,习题我做的也不多,主要是白天先看的书,书上只是一直在教我如何调用如何调用,对于一些基本的原理,不是很能理解,简单来说不是我这个水平看的,所以就找了网课

今天决定好了学习方法,后面应该会快一点,链表和跳表类的题目到明天再补上

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值