随笔分类 - 博客 编程之美解题报告(Java版)
摘要:引言 本文用了五种方法来求解这道题,从最初的n^3的复杂度到后面的n的复杂度,分别用到了递推公式、分而治之以及动态规划的方法去一步步降低算法的复杂度,《编程之美》书中关于分而治之的代码并没有提供,本文中将其补全,动态规划的代码与书中有所出入,个人感觉这样更好理解一些。 解题报告 首先我们很容易想到的一个解法就是三层遍历,首先子数组必定是连续的一串值,相当于从原数组array...
阅读全文
摘要:两种方法,一种是辗转想减法,可以对辗转相除法中对大数求模而造成的性能瓶颈进行避免 但不能避免这种情况 100000000,1 第二种用判断奇数偶数,将2的公因子提出来,分为四种情况,x,y均为偶数 x,y其中一个为偶数 x,y均为奇数,那么x-y就为偶数了 package gcd_2_7; public class Gcd_2_7 { stat...
阅读全文
摘要:基于partition做的,当index!=k时一直while循环 如果indexk,在前面找 另外最后的结果如果是0到k-1这k个数包括k-1的话,那么开始k要-1传入数组 如果不包括k-1的话,那么可以不用减1 复杂度为NlogN 另外有NlogK的算法,利用最小堆 利用partition的解法 package maxKN...
阅读全文
摘要:是数组中超过一半数目问题的升级版,但万变不离其中 声明一个time数组和candidate数组,长度为3,分别存放三个数的次数和数字 首先次数声明为0,数字声明为不存在的数,这里暂时声明为-1,其实应该声明为一个不存在的数字 然后遍历数组 如果该数是第一个candidate,第一个candida...
阅读全文
摘要:两种方法,一个是基于快排的partition函数,但这种存在一个问题,如果数组{1,1,1,1,1,1,2,3,4,5,6},这样的话,partition返回的数字为2所对应的index 所以这种方法需要添加一个判定数组中是否存在超过一半数字的数 另外一种是,首先认为第一个数就是我们想找的,设置一个time,初始为1,然后遍历后面的数,如果与这个数相同,那么time++,不同则t...
阅读全文
摘要:个数等于2的因子数+1 类似于求一个数二进制表示中1的个数 有三种求法,第一种是不断除2,也就是右移,但原问题对负数不能这么做,现在N!结果中不为负数,所以不存在这种问题 第二种求法是不断对index乘以2,然后对相应位求与 第三种是x&(x-1)不断的判断 现提供第四种方法,该方法只适用于阶乘
阅读全文
摘要:主要是看N!结果中2的个数和5的个数,多的那个个数即是末尾0的个数 计算Z有两种方法 一种是对每个n都去看有多少个5的因子 一种是隔5个增加一个5的因子,隔25个再在之前的基础上增加一个5的因子 两种方法差不多 第二种,循环少 package numOfZeroFactorialN_2_2; public class N...
阅读全文

浙公网安备 33010602011771号