
算法
在路上的咸鱼
~~~
展开
-
快排算法的实现
快排算法的实现自己按照书上的想法实现了快排,代码可用但是不够优雅。 先说一下我的总体思路(递归实现): 默认数组的第一个作为快排的中轴; 通过quicksort求出中轴在一次快排之后的位置,作为分裂点; 分别再对分裂点两侧进行快排; 求中轴的位置(): 保存第一个数作为中轴,并保护起来; j从右边开始向左,直到遇到比中轴小的停下来; 覆盖左边的i指向的数交换(因为第一个一定是中轴,而已经被保护起来原创 2017-03-13 21:42:52 · 298 阅读 · 0 评论 -
Fibonacci算法
看到了一个优雅的迭代算法。 本质思想都很简单,迭代的话,每个数只与前面两个数有关。 最容易想到的递归,毙了; 然后是数组,每一个都等于前两个之和,for循环一遍,空间占用,毙了; 再然后我的算法:public int Fibonacci(int n) { if(n==0) return 0; if(n==1)return 1; int f1=1原创 2017-05-03 03:16:12 · 346 阅读 · 0 评论 -
重构二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解答先说思路,模拟手算的步骤。 在文中默认前序是pre[],中序in[] 重构二叉树第一件事就是找到root,也就是说,找到pre[0],然后构建一个节点,作原创 2017-05-04 00:40:11 · 707 阅读 · 0 评论 -
旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解决方案public int minNumberInRotateArray(int [] a) {原创 2017-05-04 03:18:14 · 151 阅读 · 0 评论 -
矩阵覆盖
题目我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解答这个答案说得很棒。 public int RectCover(int target) { if(target==0)return 0; int f1=1,f2=2; while(--target-1>=0){原创 2017-05-04 04:04:04 · 584 阅读 · 0 评论 -
移位
题目1输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解答public int NumberOf1(int n) { int c=0; while(n!=0){ if((n&1)==1)c++; n=n>>>1; } return c; }需要注意的一点就是n应该用逻辑右移而不是算术右移,不然负数左边会补上1。原创 2017-05-05 03:08:07 · 217 阅读 · 0 评论 -
[leetcode]46. 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解法 还是回溯算法。 思路还是很简单的,本来以为可以很轻松写完,却碰到了两个大坑:python的list复制和顺序问题。 按照惯例,先贴出自己写的代码: class S...原创 2019-07-26 03:44:15 · 163 阅读 · 0 评论