算法与数据结构
BigBug_500
Talk is cheap.Show me the code.
EmailMeAt:snail.pu@foxmail.com
展开
-
随机数与概率的结合
描述:假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每首歌被随机抽到的概率是与一首歌的豆瓣评分(0~10分)成正比的,如朴树的《平凡之路》评分为8.9分,逃跑计划的《夜空中最亮的星》评分为9.5分,则希望听《平凡之路》的概率与《夜空中最亮的星》的概率比为89:95,。现在我们已知这1000首歌的豆瓣评分:(1)请设计一种随机算法来满足张三...原创 2020-03-01 19:59:22 · 1089 阅读 · 0 评论 -
反转链表与反转链表中的某一段
描述:反转链表。请使用一趟扫描完成反转。实现: public static void main(String[] args) { Node head = new Node(1, new Node(2, new Node(3, new Node(4, new Node(5, new Node(6, null)))))); System.out.println(r...原创 2020-02-29 21:46:03 · 797 阅读 · 0 评论 -
找到数组中所有重复的数字
Q:给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。例:输入: [4,3,2,7,8,2,3,1]输出: [2,3]思考:该类型题目的解法很多,如: 使用 hash 表类型的数据结构,扫描一遍数组,以数据值为 key,出现次数为 value,最后拿到所有 value 为2的 key。该思路的时...原创 2020-02-18 15:34:59 · 1803 阅读 · 1 评论 -
图的概念、存储方式,深度优先遍历与广度优先遍历
图的基本术语:图结构中顶点具有多对多的关系,有有向图和无向图的区分,有带权图和无权图的区分。QQ的好友双方中,一方删除好友,另一方的好友也会被删除,可以认为QQ的好友关系是一种无向图;微信的好友双方中,一方删除好友,另一方好友并不会被删除,可以认为微信的好友关系是一种有向图。图的存储邻接矩阵存储结构: 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个...原创 2019-11-03 16:55:19 · 926 阅读 · 0 评论 -
二叉树概念、节点数、遍历
树的一些概念二叉树(二分树) 它的特点是每个结点最多只有二棵子树,二叉树的子树有左右之分。任意一颗二叉树中,度为0的结点与度为2的结点瞒住以下关系: n0=n2+1证明如下:n个结点的二叉树,度只可能是0,1,2,分别设其对应的结点个数为n0、n1、n2,则有n=n0+n1+n2;又n结点的树只有n-1条边,则有n-1=n1+2*n2;两式相减,可得等式n0=n2+1。完全二叉树...原创 2019-10-23 14:28:31 · 1587 阅读 · 0 评论 -
TopK问题求解方案讨论(时间复杂度,空间复杂度对比)
使用分治法使用小顶堆原创 2019-10-14 23:08:51 · 3797 阅读 · 2 评论 -
KMP算法,寻找大型字符串中,给出子串出现的位置或次数
import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * kmp算法:用于大型字符串中寻找子串出现的位置或次数 * 为避免暴力遍历中 对字符串每次的回溯比较 * 在kmp中,源字符串(text)比较的指针不回溯,子串的指针不一定回溯到起始位置 * 对子串寻找最长公共前后缀的表,每次回...原创 2019-09-08 15:32:19 · 1960 阅读 · 0 评论 -
求两个字符串中的最长连续字串(基于Java)
public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) {//等待接受输入的两行数据 String s1 = in.nextLine(); String s2 = in.ne...原创 2019-09-03 22:10:10 · 1036 阅读 · 0 评论 -
对字符串的全排列(基于Java)
递归算法: /** * 1、递归算法 * * 有重复值 * 由于全排列就是从第一个数字起,每个数分别与它后面的数字交换,我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这两个数就不交换了。 * 例如abb,第一个数与后面两个数交换得bab,bba。然后abb中第二个数和第三个数相同,就不用交换了。 * 但是对bab,第二...原创 2019-09-01 10:17:20 · 1018 阅读 · 0 评论 -
基于Java的逆波兰表达式(后缀表达式)的计算
import java.util.Stack;/** * @Author Snail * @Describe 逆波兰表达式(后缀表达式) * 计算包含数字和运算符的: * 如果是数字,则入栈 * 如果是运算符,则弹出栈中两个元素使用运算符运算,再将结果入栈 * 当栈中仅有一个元素时,即为结果 * @CreateTime 2019/8/21 */public c...原创 2019-08-21 11:57:11 · 783 阅读 · 0 评论 -
分治法 应用于找到数组中的第k大元素
问题扩展讨论:TopK问题求解方案讨论(时间复杂度,空间复杂度对比)https://blog.csdn.net/BigBug_500/article/details/102558183 public static void main(String[] args) { //采用分治法找到数组中第k 大 的元素 int k = 3; ...原创 2019-08-01 21:05:22 · 2305 阅读 · 0 评论 -
升序数组,升序旋转数组的二分查找法
注意: 以下算法的实现,是在数组都是升序的情况下讨论的 public static void main(String[] args) { int [] arr1=new int[]{1,3,21,45,67,77,89,90}; int target=22; int i = binarySearch(arr1,target); ...原创 2019-07-23 15:31:11 · 1326 阅读 · 0 评论 -
小(大)顶堆的各种操作与应用场景(基于Java)
package algroithm;import java.util.Arrays;import java.util.Scanner;/** * @Author Snail * @Describe 用于堆算法的测试 * @CreateTime 2019/7/25 * <p> * <p> * 堆中父子节点索引的关系: * childIndex=par...原创 2019-07-29 17:17:54 · 1384 阅读 · 0 评论 -
给出一个数组和一个目标值,输出 数组中任意两个数字相加之和等于目标值 的位置
@Test public void a(){ int target = 13; int [] arr=new int[]{1,2,5,8,99,5,3,10,1}; int[] ints = twoSum(arr, target); System.out.println(Arrays.toString(ints)); ...原创 2019-06-27 17:26:24 · 2728 阅读 · 0 评论 -
单词查找树(Trie Tree)
应用于对大量字符串(不仅限于字符串)的保存,出现频率统计。数据结构构建思路:构建一个树型结构,除根节点为空字符以外,任意节点都有如下的属性/*** 字典树的节点类型*/class TrieNode{ char ch; //这个节点的字符 int freqs; //记录这个词出现的次数(从根节点到这个节点的串) Map<Character...原创 2019-06-19 16:35:22 · 948 阅读 · 0 评论 -
动态规划下的爬楼梯:
/** * 动态规划,时间复杂度O(n)空间复杂度O(1) * 求得斐波那契数列的第n项的值。前两项为1,2 * n阶的梯子,每步只能上一阶或两阶,求有多少中方法走完n阶 */public class Fbnx { public static void main(String[] args) { int n=5;//第n个数(从1开始) Lo...原创 2019-06-19 16:06:53 · 823 阅读 · 0 评论 -
快速排序,分治法
平均时间复杂度是O(nlogn);在传入的数组为倒序时,将出现最坏的情况,时间复杂度为O(n^2) private static void myQuickSort(int[] arr, int start, int end) { if(start>=end){ return; } int divideInd...原创 2019-06-05 11:41:35 · 896 阅读 · 0 评论