(一下这些是我自己刷题路上的总结归纳,涉及到这些题的,欢迎留言交流)
第一部分
重难点在于常见的智力性、数学性的非编程技巧。
一、贪心法
贪心法符合我们思维方式,把问题分为一步接着一步,重点在于找到每一步的策略。
二、数学归纳法(找规律)
剑指offer 整数中1出现的次数
剑指offer给的是递归算法(分治、回溯?),每次消去最高数位,求最高数位存在与否时,1个数变化。
牛逼算法用的就是数学归纳法(找规律),统计数字每一位出现的1的次数。
按行计算,计算每一行可以取哪些值。
三、数学问题
数学归纳法其实严格来说也属于数学问题,但是由于太常见,单独作为一节,本节数学问题解决需要深厚的数学功底来解决。
这个问题需要自己定义排序规则,实质是一个排序问题,这需要身后的数学功底作为依托才能想出来。而证明排序规则与排序结果即为所求这两点需要更深厚的数学功底。
第二部分
常见的编程性技巧与思想,小白一般没有接触过,需要先学习理解后加以练习
四、双指针
(1)
此题双指针算法是对动态规划算法的空间复杂度的优化,还可以用栈的贪心算法做(略)
(2)双指针滑动窗口法
无重复字符的最长子串
滑动窗口法之双指针 + 简单哈希表
五、动态规划
(简单动态规划)
(复杂动态规划)
此题动态规划算法可以用双指针算法进行空间复杂度的优化,还可以用栈的贪心算法做(略)
六、深度优先遍历dfs
(一直搞不明白dfs、回溯、递归的关系,这两天找一找答案,在此记录一下!)
ans2: 回溯搜索是深度优先搜索(DFS)的一种
对于某一个搜索树来说(搜索树是起记录路径和状态判断的作用),回溯和DFS,其主要的区别是,回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树。
为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。
leetcode 全排列
leetcode 电话号码簿
七、递归
前一天晚上:这道题好有难度,写了半晚上还是功亏一篑,看了书上解法才弄出来。就在要翻过这道题的时候,看到了牛客网上前几名的解法,瞬间给跪了。又花了半晚上,勉强看懂,太牛了。
第二天:早上起来再想昨晚看到的解法,剑指offer给的是递归算法(分治、回溯?),牛逼算法用的是数学归纳法,接地气一点的说法就是找规律。
第三部分
其他编程技巧,包括位运算、哈希运算等。
位运算
疑惑:负数1000 -1以后是0111吗,这不是就变为正数了吗?
C++中,除了四则运算只剩下位运算,通过位运算技巧可以实现。
1)题目描述:数组中有两个数字只出现一次,其余数字皆出现两次,求着两个只出现一次的数字?
基本问题:只有一个数字出现一次,其余两次,用所有数字求异或即可解决,现在需要推广的两个数字。
这俩个数字肯定不同,求异或肯定有某一位为1(最少一位),也就是说这两个数字在这个二进制位上分别为1和0,按这个原则将原数组分为两个数组,转化为刚才的基本问题。
注明:0和n异或结果为n;
2)题目描述:只有一个数字出现一次,其余数字皆出现三次,求仅出现一次的数字?
基本问题的求异或方法在这不行,可以将所有数字二进制按位相加,存放于数组,统计各位1出现的次数,数组最终对3取余,余数即为所求数字的二进制形式!!!
哈希运算
哈希算法、位运算算法
(待续)