数据结构与算法
skillart
It is me.
展开
-
快速排序不一样的实现
最近准备面试的时候准备手写快排,但是网上的快排代码基本上都是用3个while,如出一辙。就按照快排的思想自己撸一个更方便理解的代码。function qSort(arr:number[] , left:number , right:number){ if(left >= right) return; let l = left , r = right , flag = arr[(l+r) >> 1]; while(l < r) {原创 2021-05-13 03:14:12 · 226 阅读 · 0 评论 -
LeetCode 删除链表的倒数第N个节点
我来一个比较简洁的代码。思路就是手动给head前面补上一个节点,就不用有那些判空操作了。一共四行代码:export function removeNthFromEnd(head: ListNode, n: number): ListNode { let first = {next : head} , cur = first , slow = first; do{ if(n-- < 0) slow = slow.next; } while(cur = cur.next);原创 2021-04-25 01:04:47 · 119 阅读 · 0 评论 -
松散四叉树+网格法实现
最近研究了一下四叉树的实现。基本原理就不说了。在线演示链接:https://timohausmann.de/quadtree.js/dynamic.html个人觉得这个每一帧都要去清空并重建四叉树,效率不高。源码:https://github.com/timohausmann/quadtree-js/blob/master/quadtree.js //remove duplicates returnObjects = returnObjects.filter(funct原创 2021-01-26 05:07:18 · 1592 阅读 · 0 评论 -
癞子麻将胡牌以及听牌算法实现
最先实现的就是算法的实现。需求:碰杠胡 ,不能吃 ,不能听 ,只能自摸胡,其中癞子可以做任意牌但是不能碰和杠。写的时候还不会玩麻将,还是老板教的。^_^最麻烦的是胡牌算法。之前搜到的都是不包含癞子正常的胡牌,用的是%3余2,其中余数2就是余的将的意思。但是有癞子就不能这么用了。只好自己写一个了。一个有136张牌,万,饼,条,东西南北中发白34种牌。有四个癞子是直接原创 2014-10-24 11:03:29 · 32915 阅读 · 64 评论 -
DFS求一个有序数列的排列
1 2 3 5 8 13 21 34 比如给这八个数在其中选取六个;按升序输出选取的数字如下: 1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1 2 3 8 13 21 1 2 3 8 13 34 1 2 3 8 21 34 1 2 3 1原创 2013-03-04 20:27:03 · 876 阅读 · 0 评论 -
Prim
1.基本思想:设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是G的最小生成树, T的初始状态为U={u0}(u0∈V),TE={},重复执行下述操作:在所有u∈U,v∈V-U的边中找一条代价最小的边(u, v)并入集合TE,同时v并入U,直至U=V。即: (1)从连通网络 G = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),原创 2013-05-18 23:46:09 · 927 阅读 · 0 评论 -
迷宫
看到一个很经典算法,就记录下。PS:感觉很像是bfs+链表。import java.util.HashSet;import java.util.Iterator;import java.util.Set;//迷宫问题////对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更愿意使用“紧贴墙壁,靠右行走”的简单规则。原创 2013-04-02 14:23:44 · 844 阅读 · 0 评论 -
21位水仙花数
发现很多算法题目都用到回溯。很多人都已经提供了思路,之前在算其它数目的水仙花的时候总是出错,发现在dfs()里面每次忘记恢复数据,鼓捣很长时间。21位大概运行在30秒左右。import java.math.BigInteger;public class Daffodil { public static int time[]; public static int num;原创 2013-03-05 23:15:18 · 1120 阅读 · 0 评论 -
蓝点杯 打印整数划分问题
正整数n可能存在不同的划分,例如正整数6的全部划分为6=66=5+16=4+2 6=4+1+16=3+3 6=3+2+1 6=3+1+1+16=2+2+2 6=2+2+1+1 6=2+1+1+1+16=1+1+1+1+1+1在王晓东的书上有关本题的递归公式,但公式不好推,而且求的只是方案个数不满足本题题意。仔细会发现其实本题就原创 2012-07-29 11:32:08 · 1297 阅读 · 0 评论 -
详细的汉诺塔
学习算法的时候第一个递归程序就是汉诺塔,第一次只是理解个全局思想,每一步递归的细节不是很明白,总是感觉不大对劲。今天又看见汉诺塔问题了,一步步分析了一下。下面是手工图。#include #include void hanoi(int ,char ,char ,char ); int main(){ int m; printf("input the number of disk原创 2012-06-17 12:31:26 · 2863 阅读 · 0 评论 -
酒徒比酒量
一群酒徒聚在一起要比酒量。先上一瓶,各人平分。这酒真厉害,一瓶喝下来,当场就倒了几个。 于是再来一瓶,在余下的人中平分,结果又有人倒下。现在能坚持的人虽已很少,但总要决出个雌雄来。 于是又来一瓶,还是平分。如此下来一共喝了4轮终于有结果了这下总算有了结果,全倒了。 只听见最后倒下的酒徒中有人咕哝道:“嗨,我正好喝了一瓶。“请编程实现共有多少酒徒,并且每轮过后,还剩下几人没有倒下。原创 2012-08-04 01:33:28 · 1145 阅读 · 0 评论 -
广度优先搜索(Breadth first search)
和上一篇的二叉树层次遍历几乎一致。 #include#define N 8int g[N][N]= { {0,1,0,0,1,0,0,0}, {1,0,0,0,0,1,0,0}, {0,0,0,1,0,1,1,0}, {0,0,1,0,0,0,1,1}, {1,0,0,0,0,0,0,0}, {0,1,1,0,0,0,1,0}, {0,0,1,1,0,1,原创 2012-06-15 12:02:02 · 2747 阅读 · 0 评论 -
0-1背包问题(knapsack problem)
c[i][w]表示背包容量为w时,i个物品导致的最优解的总价值。递归定义如下 0 i=0或w=0c[]i[w]= c[i-1][w] wi>w原创 2012-06-10 20:05:42 · 6855 阅读 · 0 评论 -
最长公共子序列(Longest Common Subsequence LCS)
LCS问题的最优子结构可得递归式 完全可以去掉维护表b[1..m,1..n]简化最优解的构造。每个表项c[][]仅依赖于另外三个c表项:c[i-1][j-1],c[i-1][j],c[i][j-1]。在O(m+n)空间内即可重构一个LCS。#include#define M 7#define N 6using namespace std;int c[M+1][N+1];原创 2012-06-10 19:27:10 · 1274 阅读 · 0 评论 -
矩阵链乘法
设m[i][j]为计算矩阵Ai..j所需标量乘法运算次数的最小值。对整个问题计算Ai..n的最小代价就是m[i,n].使用辅助表是s[1..n,1..n]来记录计算m[i,j]时取得最优代价处k的值。k是裂开的位置。#include#define N 6void matrix(int *p,int m[][N+1],int s[][N+1],int n);void output(int原创 2012-06-09 17:43:08 · 1302 阅读 · 0 评论