摘要:
动态规划问题,刚开始想直接写个二维数组,然后存下所有sum[i,j],后来发现测试案例有1W,然后RUN TIME ERROR了 后来发现其实只需要一维数组就可以解决,sum[i]存储i之前所有值的和,求解sum[i,j]=sum[j]-sum[i-1] 还有就是数组为空时返回0,感觉这个测试案... 阅读全文
posted @ 2016-11-21 18:58
Initial_Dream
阅读(122)
评论(0)
推荐(0)
摘要:
思路:这道题其实本质是一个排序问题,将pair元素排列,使得前面大于它的first元素的个数等于second。 思考一下很容易发现,对于那些height最低的元素,second就是他们的位置,所以可以直接先排列height最低的元素,排完之后会发现其实剩下的与之前类似,排第二低元素的时候只是有些位置 阅读全文
posted @ 2016-11-21 17:22
Initial_Dream
阅读(154)
评论(0)
推荐(0)
摘要:
思路:这道题很简单,利用递归定义,一棵树的高度等于左右子树高度较大的加1,对于空树或者只有一个节点的数,高度为1。 阅读全文
posted @ 2016-11-21 17:20
Initial_Dream
阅读(118)
评论(0)
推荐(0)
摘要:
思路: 这道题的核心是判断一个数是否为素数,但是如果利用最简单的将n以内的数遍历会超时。 新的思路为那些素数的倍数的数为合数,所以可以将这些数排除,而对于一个素数p,只需要从p2开始排除,因为之前的数已经被更小的素数排除了。最后还有一点可以改进,就是p只需要判断到就可以了,以为此时p2已经大于n了。 阅读全文
posted @ 2016-11-21 17:18
Initial_Dream
阅读(108)
评论(0)
推荐(0)
摘要:
这道题的本质是求连续最大子区间问题,将数组中的每个元素转换为与前一位的差,那么最大的子区间就是收益最高的区间。 在求最大子区间时,可以想到,如果将区间分为两部分,那么最大子区间可能是左边区间的子区间,右边区间的子区间,也可能跨越中点的区间。对于左右子区间,可以很容易转化为递归步,所以只需要计算跨越中 阅读全文
posted @ 2016-11-21 17:17
Initial_Dream
阅读(154)
评论(0)
推荐(0)
摘要:
很简单的二叉树遍历问题,递归定义:两颗树相等=根相等+左子树相等+右子树相等。特殊处理根为空的情况,很容易写出递归的实现。 非递归的话深度遍历使用栈,层次遍历使用队列。 阅读全文
posted @ 2016-11-21 17:16
Initial_Dream
阅读(138)
评论(0)
推荐(0)
摘要:
很经典的递归题,爬楼梯的方法=最后走1步+最后走2步,所以很容易就能写出递归算法。然而发现超时了,知道需要使用动态编程。其实上面的也是动态编程的思路,只不过动态编程将中间结果保存,这样其实遍历一次就能得到结果。 现在重新思考了一下动态编程和分治的相同于区别: 相同点:都需要寻找子问题,由子问题的解得 阅读全文
posted @ 2016-11-21 17:15
Initial_Dream
阅读(109)
评论(0)
推荐(0)
摘要:
方法1:平凡思路从前往后比较,小于等于就停止,O(n)。 方法2:在学习二分查找的时候知道二分查找不仅可以查找到元素是否存在,如果查找不到,那么停止的位置就是插入的位置。所以重新写一遍二分查找就好了,二分查找也有递归和非递归的,比较喜欢非递归,O(logn)。 遍历法: 二分法: 阅读全文
posted @ 2016-11-21 17:14
Initial_Dream
阅读(114)
评论(0)
推荐(0)
摘要:
归并排序的归并步骤,只不过这里使用的是链表,但是归并并不需要随机访问,所以处理链表和数组的思路是一样的。 设需要归并的两个链表分别为p,q(默认为升序排列),比较p和q最左边的元素大小,较小的向后移动,直到一个走到了链表末尾。将没有走完的链表接到已排好序的链表后面即可。 阅读全文
posted @ 2016-11-21 17:13
Initial_Dream
阅读(102)
评论(0)
推荐(0)
摘要:
方法1:由于链表不能随机访问,所以很自然的想法是第一遍得到链表长度,然后计算倒数第n个结点的位置,但这样时间复杂度O(n2),想到用空间换取时间,可以用一个地址数组存储每个结点的地址,然后直接删除掉倒数第n个,返回头结点。 方法2:上面的方法虽然时间复杂度达到了线性,但是需要额外的空间,更好的方法是 阅读全文
posted @ 2016-11-21 17:13
Initial_Dream
阅读(148)
评论(0)
推荐(0)

浙公网安备 33010602011771号