寒假学习总结

寒假学习总结

前言

寒假继续学习了数据结构与算法,我们都知道,程序=算法+数据结构,所以想要更好地了解如何写好程序就需要对其进行更多研究。

在听课中学了线性表,树,图等数据结构,在写题的时候学了像是双指针,二分枚举等几种算法,学的时候是理解了,但写起来题之后感觉就不一样,自己写起来还是有诸多困难。

数据结构

线性表
线性表有单链表、双链表、循环链表,储存方式有顺序存储和链式存储

栈有栈顶和栈底,栈的插入和删除操作只能在栈顶完成
队列
只允许在表的一端进行插入,另一端删除

零个或多个字符组成的有限序列

印象最深的是树
下面对树进行详细说明

树:一对多的结构,有一个起点“根结点”

结点:树的一个数据元素

孩子:1对多里的’多’

子树:以某个孩子结点为根的一棵树

叶子结点:没有孩子的结点

森林:多棵树

二叉树

二叉树:每个结点至多两个孩子(可以1个或0个),分别称为左孩子右孩子

左孩子是左子树的根,右孩子是右子树的根

高度(深度):最深的叶子结点所在层数

每层的结点数目上限是2^(i-1)
而结点数目总数上限是(2^i)-1

二叉树的链表实现

typedef struct TreeNode{
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode;

二叉树的遍历

先序遍历:当前结点-左子树-右子树

中序遍历:左子树-当前结点-右子树

后序遍历:左子树-右子树-当前结点

哈夫曼树

重复地让当前权值最小的两个根节点作为左右孩子,生成新的根结点,新结点权值为它们的权值之和,直到形成一颗二叉树。

算法

深度优先遍历
深度优先遍历
冒泡排序
选择排序
插入排序
堆排序
归并排序
快速排序

双指针

用一道题来说明

LeetCode上的一道题:
给定一个长度为n(1≤n≤10^7)的字符串s ,求一个最长的满足所有字符不重复的子串的长度。

我们假设一个子串以 s i为左端点,s j为右端点,且从s i到s j-1中不存在重复字符,s i 到s j 中存在重复字符(换言之,s j 和 s i到s j-1中某个字符相同)

那么我们不用再检测s j后面的几个字符。

这时把枚举的左端点自增,由于 s j 这个字符与s i到s j-1中字符产生了重复,假设这个重复的字符的下标为 k ,那么 i 必须满足 i > k,所以 i可以一直自增,直到 i = k + 1

代码大致长这样

class Solution {
    int hash[257];

public:
    int lengthOfLongestSubstring(string s) {
        memset(hash, 0, sizeof(hash));
        int maxLen = 0;
        int i = 0, j = -1;            
        int len = s.length();        
        while(j++ < len - 1) {
            ++hash[ s[j] ];           
            while(hash[ s[j] ] > 1) {  
                --hash[ s[i] ];        
                ++i;
            }
            if(j - i + 1 > maxLen) {   
                maxLen = j - i + 1;
            }
        }
        return maxLen;
    }
};

总结

关于数据结构和算法需要学习的东西还是很多,目前也只是刚入门。写题的时候会遇到很多困难,比如完全没有思路,看了别人的解法之后自己也不一定能写出来。
在写题的时候发现用C语言写比较困难,急需学习其他语言,Python之前也只是粗略地学习了一下。不过语言毕竟是工具,还是要多学才行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值