刷题
Hank_HD
勤奋与选择
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
设计RandomPool结构
【题目】设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。getRandom():等概率随机返回结构中的任何一个key。【要求】Insert、delete和getRandom方法的时间复杂度都是O(1)思路:要求增删时间复杂度均为O(1),很容易想到哈希表,但哈希表不具备严格等概率返回...原创 2019-02-25 15:48:43 · 251 阅读 · 0 评论 -
将单向链表按某值划分成左边小、中间相等、右边大的形式
【题目】给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点。除这个要求外,对调整后的节点顺序没有更多的要求。例如:链表9->0->4->5->1,pivot=3。调整后链表可以是1->0->4-&...原创 2019-02-22 20:37:47 · 415 阅读 · 0 评论 -
两个单链表相交的一系列问题
两个单链表相交的一系列问题【题目】在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。要求:如果链表1的长度为N,链表2的长度为M,时间复杂度请达到O(N+M),额外空间复杂度请达到O(1)。思路:1.先判断两个链表的情况(是否有环)...原创 2019-02-20 20:18:18 · 399 阅读 · 1 评论 -
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序。
题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。思路:因为不能使用非基于比较的排序,所以不能应用桶排序后遍历找最大差值。但可以应用桶排序的思想:创建一个比原数组个数加一的桶,数组的最小值放在第0号桶里,数组的最大值放在最后一个桶里,然后遍历数组,桶内只放该区域的最大值和最小值。遍历之后中间一定会有一个空桶,要注意的是空桶的左边的最小...原创 2019-02-20 18:21:26 · 939 阅读 · 0 评论 -
由两个栈组成的队列
编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)class TwoSatckQueue { private Stack<Integer> StackPush; private Stack<Integer> StackPop; public TwoSatckQueue() { StackPush = new Stack<...原创 2018-06-19 22:53:15 · 203 阅读 · 0 评论 -
设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的前提下,实现返回栈中最小元素的操作方案一:class MyStack1 { private Stack<Integer> stackData; private Stack<Integer> stackMin; public MyStack1() { this.stackData = new Stack<In...原创 2018-06-19 22:34:04 · 230 阅读 · 0 评论 -
排序(二)
快速排序: // 以最后一个元素为比较对象 左边是小于它的元素 右边是大于它的元素 public static int[] partition(int[] arr, int l, int r) { int less = l - 1; int more = r; int cur = l; while (cur < more) { if (arr[cur] <...原创 2018-05-24 11:22:34 · 230 阅读 · 0 评论 -
排序(一)
冒泡排序: public static void bubbleSort(int[] arr) { for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j + 1]; ...原创 2018-05-14 11:30:29 · 295 阅读 · 0 评论 -
01背包 动态规划(三)
01背包问题详解,暴力递归改动态规划测试数据: int n=5;//物品个数 int m=20;//背包容量 int[] weight=new int[]{0,2,3,4,5,9};//物品重量 int[] value=new int[]{0,3,4,5,8,10};//物品价值1.递归版本:private static int knapsack(int n,in...原创 2018-05-15 16:00:17 · 525 阅读 · 0 评论 -
动态规划(二)
例:给你一个数组arr,和一个整数aim。如果可以任意选择arr中的数字,能不能累加得到aim,返回true或者false。测试数据:int[] arr = { 1, 4, 8 }; int aim = 12;1.写出尝试(递归)版本private static boolean isSum1(int[] arr, int i, int sum, int aim)...原创 2018-05-09 20:13:05 · 678 阅读 · 1 评论 -
矩阵的最小路径和 动态规划(一)
暴力递归改动态规划例:给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径和。测试数组:int[][] m = { { 3, 1, 0, 2 }, { 4, 3, 2, 1 }, { 5, 2, 1, 0 } }; 1.写出尝试(递归)版本 private static...原创 2018-05-09 16:02:57 · 1117 阅读 · 0 评论
分享