算法
文章平均质量分 54
WYQ_XQ
量的积累引起质的飞跃!!!
展开
-
无序数组最小的k个数
import java.util.*;public class KthNumbers {/*分析:先找到最大的第k个数 遍历原数组比k小的输出即可* 利用优先级队列实现堆排序* 现将前k个数存入队列中* 然后从k+1~n遍历 和队列中最大的比较 如果小于最大值 说明这个数在k个数中 将最大值出列 将这个值加入队列* 遍历结束 得到k个数中的最大值 遍历原数组将比最大值小的输原创 2016-03-30 10:34:43 · 1224 阅读 · 0 评论 -
字符混编
对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。测试样例:"ABC",3,"12C",3,"A12BCC",6返回:true解析:s原创 2016-04-15 21:27:26 · 637 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1},{2,3,[4,2,6],2,5,原创 2016-04-29 22:22:03 · 433 阅读 · 0 评论 -
奶牛家族
题目:在农场中,奶牛家族是一个非常庞大的家族,对于家族中的母牛,从它出生那年算起,第三年便能成熟,成熟的母牛每年可以生出一只小母牛。即母牛从出生开始的第三年便能做妈妈。最开始农场只有一只母牛,它从第二年开始生小母牛。请设计一个高效算法,返回第n年的母牛总数,已知n的范围为int范围内的正整数。给定一个正整数n,请返回第n年的母牛总数,为了防止溢出,请将结果Mod 100000000原创 2016-05-02 14:13:18 · 974 阅读 · 0 评论 -
蓄水池算法
适用情况:从n个数中等概率随机取出k个数,n很大,k也很大;n不固定增量型内容:当i属于1~k i入池 当i>k i以概率k/i决定是否进入池,1/k概率剔除池中一个数证明:1:当i当k个数时, i留下概率=1当k+1个数时,i被淘汰的概率=1/k*k/k+1=1/k+1 i留下概率=1-1/k+1=k/k+1原创 2016-05-05 19:37:12 · 570 阅读 · 0 评论 -
不用加减乘除做加法
class Solution { /*5的二进制是101,17的二进制10001。还是试着把计算分成三步: 第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1, 相加的结果是二进制的10。这一步不计进位,因此结果仍然是0); 第二步记下进位。 在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10; 第三步把前原创 2016-07-04 12:29:17 · 319 阅读 · 0 评论 -
最小的K个数
import java.util.ArrayList;public class Solution { public ArrayList GetLeastNumbers_Solution(int [] input, int k) { ArrayList list = new ArrayList();if(input==null||input.length==0|原创 2016-07-04 15:25:03 · 277 阅读 · 0 评论 -
数组中的逆序对
有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。测试样例:[1,2,3,4,5,6,7,0],8返回:7import java.util.*;public class AntiOrde原创 2016-07-04 16:11:32 · 438 阅读 · 0 评论 -
最大和子矩阵
有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。测试样例:[[1,2,-3],[3,4,-5],[-5,-6,-7]],3返回:10先将二维数组纵向合并成一维数组 然后计原创 2016-04-17 21:04:27 · 771 阅读 · 0 评论 -
子数组系列问题
题目来源牛客网1.求两个子数组最大的累加和【题目】给定一个数组,其中当然有很多的子数组,在所有两个子数组的组合中,找到相加和最大的一组,要求两个子数组无重合的部分。最后返回累加和。【要求】时间复杂度达到 O(N) 思路:可以按照位置i将数组分为0~i 和i+1~n两部分分别求出0~i的最大和,i+1~n的最大和可是随着i的改变每次都要求两个数组的最大子数组和 时间复杂度原创 2016-08-07 20:38:17 · 2327 阅读 · 2 评论 -
二维递增子序列
题目:给定一个 N*2的二维数组,看作是一个个二元组,例如[[a1,b1],[a2,b2],[a3,b3]],规定:一个如果想把二元组甲放在二元组乙上,甲中的a 值必须大于乙中的a 值,甲中的b值必须大于乙中的 b 值。如果在二维数组中随意选择二元组,请问二元组最多可以往上摞几个?例如:[[5,4],[6,4],[6,7],[2,3]],最大数量原创 2016-07-23 17:05:19 · 959 阅读 · 6 评论 -
旋转字符串
旋转字符串【题目】给定一个字符类型的数组 chas 和一个整数 size,请把大小为 size 的左半区整 体移到右半区,右半区整体移到左边。【举例】如果把 chas 看作字符串为"ABCDE",size=3,调整成"DEABC"。【要求】如果 chas 长度为 N,两道题都要求时间复杂度为 O(N),额外空间复杂度为 O(1)。代码:/*将字符串分成左右两部分原创 2016-10-22 23:22:06 · 559 阅读 · 0 评论 -
数组中未出现的最小正整数
请设计一个高效算法,查找数组中未出现的最小正整数。给定一个整数数组A和数组的大小n,请返回数组中未出现的最小正整数。保证数组大小小于等于500。测试样例:[-1,2,3,4],4返回:1/*分析:* 最小的没有出现的正整数* 如果1没有出现 那么最小结果为1* 如果1到500都出现那么最下的结果为n+1* 因此结果的范围1~n+1原创 2016-03-29 10:30:00 · 3441 阅读 · 0 评论 -
最小编辑代价
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。测试样例:"abc",3,"adc",3,5,3,100原创 2016-04-13 13:03:31 · 934 阅读 · 0 评论 -
添加回文串
对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。测试样例:"ab",2返回:"a" public String addToPalindrome(String A, int n) { /*不断原创 2016-04-02 09:46:36 · 751 阅读 · 1 评论 -
相邻最大差值
题目: 请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。 给定一个整数数组A和数组的大小n,请返回最大差值。代码: /**分析:* 这是一个典型的利用桶排序求解问题,因为桶排序不少基于比较的排序可以打破nlogn的下限,* 可以达到题目要求的复杂度n* 相邻两个数差值最大 肯定大于平均值 平原创 2016-03-21 16:18:17 · 1045 阅读 · 0 评论 -
左右最值最大差
给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?给定整数数组A和数组的大小n,请返回题目所求的答案。测试样例:[2,7,3,1,1],5返回:6import java.util.*原创 2016-04-04 11:12:27 · 449 阅读 · 0 评论 -
排序比较
插入排序: 直接插入排序:依次将待排序的序列插入到已排序的序列。 时间复杂度:goodO(n) bad(n*2)空间复杂度O(0) 稳定性:稳定 希尔排序:将待排序列分成若干组,每组进行插入排序。 时间复杂度:O(nlogN) 空间复杂度O(0) 稳定性:不稳定 交换排序: 快排:前后两个指针比原创 2016-02-27 13:22:23 · 305 阅读 · 0 评论 -
链表相交是否有环
链表:1:两个无环链表相交判断: A>B 先将A移动与B等长,比较第一次遇到相等的即为交点。2:两个有环链表相交: H1,H2两个环 A B两个指针第一种:若相交环必为公共环求出H1,H2两个环的入口点若入口点相同则交点在环 前,按照无环方法求交点,若入口点不同这交点在环内,以任意入口点为交点可。第二种:先将两个指针指向H1,A每次走一原创 2016-02-27 13:26:19 · 348 阅读 · 0 评论 -
集合的子集
请编写一个方法,返回某集合的所有非空子集。给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。[123,456,789]子集:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}集合的每原创 2016-03-23 22:16:01 · 757 阅读 · 0 评论 -
字符串全排列
编写一个方法,确定某字符串的所有排列组合。给定一个string A和一个intn,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)测试样例:"ABC"返回:[“CBA”,"CAB","BCA","BAC","ACB","ABC"]/*designed by w原创 2016-03-24 16:53:44 · 532 阅读 · 0 评论 -
最长递增子序列
对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui 给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。测试样例:[2,1,4,3,1,5,6],7返回:4import java.util.*;public class AscentSequence原创 2016-04-07 12:23:26 · 438 阅读 · 0 评论 -
多数组中位数
给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数。例如:arr1 = {1,2,3,4};arr2 = {3,4,5,6};一共8个数则上中位数是第4个数,所以返回3。arr1 = {0,1,2};arr2 = {3,4,5};一共6个数则上中位数是第3个数,所以返回2。要求:时间复杂度O(logN)解析:首先求中原创 2016-04-25 11:33:08 · 892 阅读 · 0 评论 -
换零钱:有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。
换零钱:有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。测试样例6返回:2动态规划dp[i][sum] 使用i 种硬币组成sum有多少种方式。设v1,v2,v3,v4 硬币的面值sum = v1*原创 2016-04-09 11:34:42 · 2757 阅读 · 0 评论 -
最短排序
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。给定一个整数数组A及它的大小n,请返回最短子数组的长度。测试样例:[1,5,3,4,2,6,7],7返回:4 /*分析: * 要排序的最小数组 数组起点start 数组终点end * 如果一个数组是有序的依次遍历数组 后一个永远大于前一个 单调递增 * [i,n原创 2016-04-06 10:59:43 · 569 阅读 · 0 评论 -
子数组系列二:最大值减去最小值小于或等于 k 的子数组数量
题目来源牛客网最大值减去最小值小于或等于 k 的子数组数量给定数组 arr 和整数 k,共返回有多少个子数组满足如下情况:max(arr[i..j]) - min(arr[i..j]) max(arr[i..j])表示子数组 arr[i..j]中的最大值,min(arr[i..j])表示子数组 arr[i..j]中的最小值。【要求】如果数组长度为 N,请实现时间复杂度为 O原创 2016-08-21 15:09:35 · 3701 阅读 · 7 评论