12 2018 档案
摘要:最优子结构:通过求子问题的最优解,可以获得原问题的最优解。 解法一:记忆化搜索 解法二:动态规划 思路:如下图所示,红色部分表示平方数,所有的完美平方数都可以看做一个普通数加上一个完美平方数,那么递推式就变为了:dp[i + j * j] = min(dp[i] + 1, dp[i + j * j]
阅读全文
摘要:1. 记忆化搜索 - 自上向下的解决问题:使用vector来保存每次计算的结果,如果下次再碰到同样的需要计算的式子就不需要重复计算了。 2. 动态规划 - 自下向上的解决问题 解法一:自顶向下 解法二:自底向上 注意:从2只能移动到3和4;从3只能移动到6和5. 思路:设从位置(i,j)达到底部的最
阅读全文
摘要:本题是从1开始计数;n一定是合法的。 能否只遍历一遍链表? n = 2, 则要删除4和5。使用两个指针来寻找要删除的区间。 思路:快慢指针,一开始让fast和slow指向链表的头结点,然后让fast指向链表旋转k位后的头结点,然后fast和slow同时向后移动,直到fast指向原链表的最后一个元素,
阅读全文
摘要:该逻辑对于删除第一个元素不适用。 这样的代码不优美 可以设置一个虚拟的头结点: 这道题想了好久,原因是要把重复的所有元素都删除,这里设立一个duplicate标志位来记录当前cur是否与下一个结点重复。 又重新做了一遍这道题,思路和前面设置标志位记录重复的不太一样。重点在于在两个结点不相同时,需要判
阅读全文
摘要:表不支持随机查找,通常是使用next指针进行操作。 206. 反转链表 需要考虑以上两个问题,在本题中已经假定1 <= m <= n <= length of list 思路: 完整的翻转链表程序: 思路:在链表中,可以通过创建两个新的头结点指针,来分别指向小于x的结点和大于等于x的结点,遍历结束之
阅读全文
摘要:思路:滑动窗口(长度为k+1)看这个窗口里的是否有两个元素的值相同。加查找表。 注意:是数组中有重复的元素返回true,没有返回false。 用set运行的更快。 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小
阅读全文
摘要:类]
阅读全文
摘要:这道题已知字符串只有小写字母。可以使用map把字符和对应的次数联系起来。若在s[i]中的字符counts++; 若在t[i]中的字符counts--。 最后来遍历counts判断每个字符的键值,若为0说明t也有s中的对应字符,否则没有返回false。 思路:1)若可以在m中找到在pattern里面的
阅读全文
摘要:两类查找问题: 1)查找有无: - 某个元素是否存在,通常使用set(集合) 2)查找对应关系(键值对应) - 某个元素出现了几次,map(字典) set和map都不允许里面的键值重复。 常见操作: - insert - find - erase - change(map) 思路:把nums1放到一
阅读全文
摘要:滑动窗口:这两个索引表示的是一个窗口,让这个窗口不停的在数组中滑动,来找到问题的解。 -什么叫子数组:可以不连续。但是本题强调了是要连续的。、 解法一:滑动窗口 时间复杂度:O(n),空间复杂度O(1) 因为没有另外开辟空间。 思路:和209类似采用滑动窗口的思路。在[l...r]区间中表示不重复的
阅读全文
摘要:Two sum: 哈希表解法; 注意这两个元素不能是相同的。 解法一:二分查找法,逐一取数组中的值,然后second = target - numbers[i] , 用二分查找法求第二个值。 时间复杂度:O(nlongn) 解法三:对撞指针 使用两个指针,若nums[i] + nums[j] > t
阅读全文
摘要:题意:给定一个数组nums,求若 i<j and nums[i] > 2*nums[j] 的逆序对。 Note: 数组的长度不会超过50,000 不愧是hard模式的题目,虽然已经知道可以用归并排序来做,但是写出来的答案总有问题,真的是暴风哭泣 :( 一直在找bug,最后发现是我写的merge函数有
阅读全文
摘要:1. 我们知道它们都使用了分治算法:将原问题分割成同等结构的子问题,子问题解决后,原问题也得到了解决。 衍生出来的问题: 1)逆序对: 对应题目: 剑指:数组中的逆序对,在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将
阅读全文
摘要:题目:在无序的数组中找到第k大的元素,也就是若长度为n的数组从小到大排列时,下标为n-k的元素。 注意Example2:第4大的元素是4,也就是数组中出现的两个5分别是第2大和第3大的数字。 解法一:直接利用sort函数排序后,取第k大的元素。 解法二:快排 时间复杂度是:O(n) 注意几个问题:
阅读全文
摘要:时间复杂度O(nlongn) 基本思想:取一个枢纽值(privot),将剩余数组的值依次与privot进行比较,若比privot大就放在privot左边;若小就放在右边。 基础版:假设数组左边界下标为l,右边界下标为r,将下标l所在的元素值记为privot,使得 arr[l+1...j]<v ; a
阅读全文
摘要:直接插入排序: 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数
阅读全文
摘要:选择排序 Selection Sort 1)在数组中找最小的数与第一个位置上的数交换; 2)找第二小的数与第二个位置上的数交换; 3)以此类推 完整代码: 相应头文件:Student.h
阅读全文
摘要:归并排序:先将数组一分为二,将左边部分排序(同样将其一分为二),再将右边部分排序,最后逐层归并。(分治策略)(稳定排序)。 算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的! 先排序的时间复杂
阅读全文
摘要:解法一:计数排序:统计0,1,2 的个数 时间复杂度:O(n) 空间复杂度:O(k) k为元素的取值范围, 此题为O(1) 解法二:三路快排 时间复杂度:O(n) 空间复杂度:O(1) 只遍历了一遍
阅读全文
摘要:解法一: 时间复杂度O(n) 空间复杂度O(1) 解法二:将非0元素与0元素交换位置,其中k指向非零元素的位置,且为了不让两个0元素之间相互交换位置,则增加一个判断条件( i != k) 我用了一个比较简便的解法,使用了vector的erase()函数直接删除等于val的元素(相当于下标自动加了一,
阅读全文
摘要:此处的需要注意的点是: 为什么不用 int mid = (l+r)/2 因为mid,l,r 都是整型,所以如果l,r过大,相加后容易整型溢出,所以使用
阅读全文

浙公网安备 33010602011771号