数据结构
渣渣张
再回首,初心不变
展开
-
sorted
(一):sortedweiggle sort: 1)先把数组排序。 2)从中间分开;把小的那部分数组上的数放在偶数位数组上;把大那部分的数放在奇那部分的数组上;都是从后往前遍历。public void wiggleSort(int[] nums) { int l = nums.length; quicksort(nums, 0, nums.length - 1原创 2017-12-09 10:09:21 · 198 阅读 · 0 评论 -
蓄水池抽样问题
1.问题描述:随机抽样问题表示如下:要求从N个元素中随机的抽取k个元素,其中N无法确定。这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保持随机性,于是有了这个问题。所以搜索网站有时候会问这样的问题。2. k =1的情况:解法:我们总是选择第一个对象,以1/2的概率选择第二个,以1/3的概率选择...原创 2018-10-24 10:54:56 · 195 阅读 · 0 评论 -
趣味算法题-3
1.给出N和K还有一串数字字符串,按最小的代价把字符串变为K个相同数字的字符串,代价为原数字变为该数字后的差值。public static void phoneNumber() { Scanner in = new Scanner(System.in); int N = in.nextInt(); int K = in.nextInt(); String s = in.ne...原创 2018-09-03 20:00:32 · 204 阅读 · 0 评论 -
趣味算法题-1
1.在一维坐标轴上有n个区间段(坐标),求重合区间最长的两个区间段1.先按有坐标排序。2.用递归算法解决从后往前找长度。public class point { //定义点类 int x; int y; public point() { // TODO Auto-generated constructor stub } public point(int x, int ...原创 2018-10-03 21:27:47 · 230 阅读 · 0 评论 -
趣味算法题-1
1.MAX(a,b)不能用比较符号,if,else,问好,冒号输出二者最大值public static int max(int a, int b) { System.out.println((a&(b-a>>31))); System.out.println((b&~((a-b>>31)+1))); return (a&(b-a...原创 2018-10-03 21:28:11 · 777 阅读 · 0 评论 -
有趣的算法题-3
1.链表中环的入口节点假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程)当快慢指针相遇的时候:此时慢指针走的路程为Sslow = x + m * c + a快指针走的路程为Sfast = x + n * c + a2 Sslow = Sfast2 * ( x + m*c + a ) = (x + n *c + a...原创 2018-10-03 21:27:38 · 156 阅读 · 0 评论 -
有趣的算法题-1
java结构中:Queue:offer,poll,isEmpty,peek定义队列:Queue<Integer> queue = new LinkedList<Integer>();Stack:push,pop,Empty,peek一 二维数组中查找:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递...原创 2018-10-03 21:27:55 · 273 阅读 · 0 评论 -
有趣的算法题-2
一:二叉搜索树和双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。1.要用一个lastNode指针指着最右的节点。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...原创 2018-10-03 21:28:03 · 427 阅读 · 0 评论 -
0-1背包法
求一个背包装最大货物:一个背包最多装重量为 C = 10 的物品,现有物品数 n = 5,物品的重量跟价值如下,求该怎么装能装到物品价值w = {2,2,6,5,4} v = {6,3,5,4,6} wv123456789101260669912121515152230336699910113650006666610114540006666610105460006666666public clas...原创 2018-06-22 09:06:46 · 512 阅读 · 0 评论 -
DP
(一)简介:动态规划与分治法的区别,分治法一般是可以将问题分为没有重叠的子问题,而动态规划则是一般是子问题是重叠的,大的问题可以分为小的子问题再求解,其与递归的区别是,这些子问题的求解只要求解一次就可以,我们会把它保存下来,下次用到直接取值即可,一般实现这样的做法就是把问题从小问题开始求解到大问题,从下往上求解,需要用到的子问题的解保存下来。 我们求解动态规划一般先找子结构,边界,跟状态转移方程。原创 2017-12-17 14:18:08 · 242 阅读 · 0 评论 -
Divide and Conquer
(一)Kth Largest Element in an Array:当寻找第K大的数时,我们可以用quickselect 方法。 1)The basic idea is to use Quick Select algorithm to partition the array with pivot:Put numbers < pivot to pivot's leftPut numbers >原创 2017-12-11 00:05:00 · 415 阅读 · 0 评论 -
算法小 trick
1.在数组中求若干个数之和为某一给定值public boolean isExistence(int[] a, int target){ boolean[] dp = new boolean[target+1]; for(int n : a) { for(int i = dp.length-1; i >= n; i--) { ...原创 2019-03-09 20:10:17 · 202 阅读 · 0 评论