【小白刷题之路Day22】算法分类总结

(一下这些是我自己刷题路上的总结归纳,涉及到这些题的,欢迎留言交流)

 

第一部分


重难点在于常见的智力性、数学性的非编程技巧。

 

一、贪心法

贪心法符合我们思维方式,把问题分为一步接着一步,重点在于找到每一步的策略。

剑指offer 剪绳子

 

 

二、数学归纳法(找规律)

剑指offer 整数中1出现的次数

剑指offer给的是递归算法(分治、回溯?),每次消去最高数位,求最高数位存在与否时,1个数变化。

牛逼算法用的就是数学归纳法(找规律),统计数字每一位出现的1的次数。

 

leetcode Z字形变换

按行计算,计算每一行可以取哪些值。

 

 

三、数学问题

数学归纳法其实严格来说也属于数学问题,但是由于太常见,单独作为一节,本节数学问题解决需要深厚的数学功底来解决。

剑指offer 把数组排成最小的数

这个问题需要自己定义排序规则,实质是一个排序问题,这需要身后的数学功底作为依托才能想出来。而证明排序规则与排序结果即为所求这两点需要更深厚的数学功底。

 

第二部分


 

常见的编程性技巧与思想,小白一般没有接触过,需要先学习理解后加以练习

 

四、双指针

(1)

leetcode接雨水 

此题双指针算法是对动态规划算法的空间复杂度的优化,还可以用栈的贪心算法做(略)

 

(2)双指针滑动窗口法

无重复字符的最长子串

 滑动窗口法之双指针 + 简单哈希表

 

 

五、动态规划

(简单动态规划)

剑指offer 连续子数组的最大和

剑指offer 构建乘积数组

斐波那契数列

跳台阶&爬楼梯

 

(复杂动态规划)

leetcode 接雨水

此题动态规划算法可以用双指针算法进行空间复杂度的优化,还可以用栈的贪心算法做(略)

 

 

 

六、深度优先遍历dfs

(一直搞不明白dfs、回溯、递归的关系,这两天找一找答案,在此记录一下!)

ans2: 回溯搜索是深度优先搜索DFS)的一种
对于某一个搜索树来说(搜索树是起记录路径和状态判断的作用),回溯和DFS,其主要的区别是,回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树。
为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。

 

 

leetcode 全排列

leetcode 电话号码簿

leetcode 括号生成

 

 

七、递归

剑指offer:整数中1出现的次数

 前一天晚上:这道题好有难度,写了半晚上还是功亏一篑,看了书上解法才弄出来。就在要翻过这道题的时候,看到了牛客网上前几名的解法,瞬间给跪了。又花了半晚上,勉强看懂,太牛了。

第二天:早上起来再想昨晚看到的解法,剑指offer给的是递归算法(分治、回溯?),牛逼算法用的是数学归纳法,接地气一点的说法就是找规律。

 

第三部分


 

其他编程技巧,包括位运算、哈希运算等。

位运算

剑指offer 二进制中1的个数

疑惑:负数1000 -1以后是0111吗,这不是就变为正数了吗?

剑指offer 不用四则运算实现加法

C++中,除了四则运算只剩下位运算,通过位运算技巧可以实现。

剑指offer 数组中只出现一次的两位数字

1)题目描述:数组中有两个数字只出现一次,其余数字皆出现两次,求着两个只出现一次的数字?

     基本问题:只有一个数字出现一次,其余两次,用所有数字求异或即可解决,现在需要推广的两个数字。

这俩个数字肯定不同,求异或肯定有某一位为1(最少一位),也就是说这两个数字在这个二进制位上分别为1和0,按这个原则将原数组分为两个数组,转化为刚才的基本问题。

注明:0和n异或结果为n;

2)题目描述:只有一个数字出现一次,其余数字皆出现三次,求仅出现一次的数字?

基本问题的求异或方法在这不行,可以将所有数字二进制按位相加,存放于数组,统计各位1出现的次数,数组最终对3取余,余数即为所求数字的二进制形式!!!

 

 

哈希运算

剑指offer 数组中只出现一次的数字

 哈希算法、位运算算法

leetcode 整数转罗马数字

 

(待续)

posted @ 2019-09-21 17:47  ACStrive  阅读(200)  评论(0编辑  收藏  举报