IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 在练习了十七道算法题后的一些小结 -> 正文阅读

[数据结构与算法]在练习了十七道算法题后的一些小结

算法小结

从被要求每天做一道算法题以来,已经做了十七道不同难度的算法题了,涉及到树、链表、栈 等数据结构的知识,也使用过动态规划、递归算法、贪心算法等常用解题思路。在做过了这些题后,也发现了自己的不足与知识的欠缺,同时也总结下来了一些小小的解题思路,在这里记录一下:



认清自己的实力

这点非常重要!!“Rome was not built in a day” 谁都是从菜鸟一步一步过来的,不要急于求成。既然是初学者就安安心心的从简单题目开始入手(大佬忽略),毕竟力扣上题目难度也不是写着玩的,在一遍遍的练习中分析自己的劣势与知识的欠缺,细心总结,查漏补缺,慢慢递增难度,将自己做不出的题目可以先放放,等日后自己羽翼丰满,再来挑战这道题。在自身能力薄弱的情况下,就算看着别人写的算法,自己也无法理解透彻,只会徒增烦恼。叫你去面对挑战,可不是去送死,不是每个新生的勇者都跳过新手村直接讨伐魔王。


优先分析题目

在我们着手于一道算法题时,一定不要急于去写代码,要先分析题目。分析算法的输入参数有哪些,输入的范围又为多少;要求的返回参数是什么,要求的运行效果又是什么,看清题目上的示例,明白到底要做什么。可不要一看题目思如泉涌,最后写完再看题目才发现是自己审错了题,白用功。
我就曾犯过这样的错误,在做算法题 Z-字型变换 时,我就因为没有好好审题而陷入自己的思维误区。题目要求是:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

我将解释当做要求输出的结果,在那里抓耳挠腮的想了一下午,实在想不明白准备去找人询问时才发现题目不需要输出Z-字型变换的图形结果,只用输出Z-字型变换后的字符串结果。
Z-字型变换解题详解


分析简化操作与排错

再写了这十多道算法题后,我发现很多题都会有一些特殊的输入值,这些输入值没必要让算法程序去完整的走一遍。为了避免不必要的浪费,我们就要思考在这道题中,什么样的输入可以很简单的输出:
Z-字型变换 中可以进行这样的简化操作 :

//当s的长度小于numRows与numRows==1时,直接返回s
        if (s.length() < numRows || numRows == 1){
            return s;
        }

跳跃游戏 中可以进行这样的简化操作 :

if (nums.length == 0 || (nums.length > 1 && nums[0] == 0)) return false;
        else if (nums.length == 1) return true;//只有一位时直接满足

其实看多了就知道这些简化操作大多都是限定只运行一次或两次的结果,是可预知的,可以直接弹出结果,避免不必要的浪费。
当然,排错也是同理,保证了算法运行的准确,不报错。


打好数据结构的基础

数据结构很重要!数据结构很重要!数据结构很重要!重要的事情说三遍!
数据结构的学习真的特别重要,在写算法时经常会使用到栈、队列、链表、树等数据结构,若自己没有打好数据结构的基础,算法书写起来就十分的难受。尤其像树、链表这种无法直接看到数值的数据结构,理解起来会很困难。
这里推荐练习下树的前序、中序、后续遍历和删除链表的倒数第N个结点


多找点经典算法题来做

很多算法题都是在经典算法题的基础上来进行变种的,在与之前有一定相似的基础上,每次都有新的挑战,这样的题可以更快的提升自己。而且经典算法题的解题思路很具有代表性,可以用于很多题的解法,所谓举一反三就是如此:
比如经典算法题中的杨辉三角

class Solution {
    public List<List<Integer>> generate(int numRows) {
       List<List<Integer>> list = new ArrayList<List<Integer>>();
        for (int i = 0 ; i < numRows ; i++){
            //存放每一行二维数组的list
            List<Integer> rowList = new ArrayList<Integer>();
            for (int j =0 ; j <= i ; j++){
                if (j == 0 || j == i) rowList.add(1);// 存入最左和最右的1
                else rowList.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));//存入中间,由上图可知为[i-1][j-1]+[i-1][j]
            }
            list.add(rowList);//把每一行存入整体
        }

        return list;
    }
}

就是经典的动态规划题目,同样的还有爬楼梯与斐波那契数列

还有就是经典的贪心算法题目——跳跃游戏系列

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 0 || (nums.length > 1 && nums[0] == 0)) return false;
        else if (nums.length == 1) return true;//只有一位时直接满足

        int maxDistance = nums[0];//读出第一位,暂为最大距离
        for (int i = 0; i <= maxDistance; i++) {
            maxDistance = Math.max(maxDistance, i + nums[i]);//把能跳到的最大位置存入maxDistance
            //当前最大距离大于数组最长距离
            if (maxDistance >= nums.length - 1) {
                return true;
            }
        }
        return false;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:20:33  更:2021-08-07 12:22:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:38:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码