算法
wangyangmingtian
这个作者很懒,什么都没留下…
展开
-
贪心算法
贪心算法,本算法的示例是尽可能往固定背包里放入尽可能价值高的物品,从而获取更大的价值,应该根据物品的性价比比较,来做取舍,具体的Java代码实现如下所示:import java.util.Arrays;/** * 贪心算法 */public class GreedyPackage { private int MAX_WEIGHTS=150; private int[...原创 2018-08-31 09:48:10 · 97 阅读 · 0 评论 -
在数组中找到出现次数大于N/K的数
原始题目:给定一个整形数组arr,打印出其中出现次数大于一半的数,如果没有这样的数,打印提示信息。进阶题目:给定一个整形数组arr,再给定一个整数k,打印所有出现次数大于N/K的数,如果没有这样的数,打印提示信息。要求:原始问题要求时间复杂度为O(N),额外空间复杂度为O(1)。进阶问题要求时间复杂度为O(N*K),额外空间复杂度为O(K)。原始问题:设定一个候选值cands,以及记录...原创 2018-12-20 10:31:30 · 1175 阅读 · 0 评论 -
添加最少字符使字符串整体都是回文字符串
给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。思路:该题可以采用动态规划解决,创建矩阵dp[i][j],如果str[i]==str[j],则dp[i][j]=0,如果str[i]!=str[j],dp[i][j]=min{dp[i+1][j],dp[i][j-1]}+1;其中矩阵表示添加字符的最少数量。具体代码实现...原创 2018-12-20 08:25:03 · 1956 阅读 · 0 评论 -
排序算法之选择排序算法
基本思想:选择排序在数组中不断的寻找到最小值(升序排列),然后将找到的值与指定的位置进行替换,即可看做将原数组分为两部分,一部分为有序的,另一部分为无序的,设置一个变量指向无序的第一位,每次遍历的时候只需要在无序的那部分查找最小值即可,直到最后排序成功,具体Java代码实现如下所示:public class SelectSort { /** * 选择排序算法 */...原创 2018-08-24 21:48:12 · 149 阅读 · 0 评论 -
排序算法之直接插入排序
插入排序具体Java代码实现如下所示:public class InsertSort { /** * 直接插入排序算法 * @param array */ public void insertSort(int[] array){ int data; for (int i=1;i<array.length;i++...原创 2018-08-25 18:32:13 · 130 阅读 · 0 评论 -
排序算法之二分法插入排序
二分法插入排序与直接插入排序很相似,只不过,在查找插入位置的时候,用的是二分查找方法,具体的Java代码实现如下所示:public class BinaryInsertSort { private void binaryInsertSort(int[] array){ for (int i=0;i<array.length;i++){ i...原创 2018-08-25 20:41:03 · 1025 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序影响时间复杂度的因素是增量的改变,改变的幅度越大时间复杂度越少,具体Java代码实现如下所示:public class HeerSort { /** * 希尔排序 */ private void heerSort(int[] array){ //d为增量,调整增量的变化方式可以减少时间复杂度,本算法采取的是增量递减一的方法改变增量的...原创 2018-08-25 21:32:33 · 147 阅读 · 0 评论 -
排序算法之堆排序
堆排序实际上利用了树的原理,其中在进行堆排序的过程,要先对给定的数组进行建堆(本算法采用的是大堆,即根节点比左右孩子都大),然后获取数组的中间值,根据此值,进行遍历建堆。具体Java实现代码如下所示:public class HeapSort { public void heapSort(int[] array){ if (array == null || array....原创 2018-08-26 13:31:07 · 119 阅读 · 0 评论 -
排序算法之快速排序
快速排序思想:快速排序实际上就是交换元素,类似于二分查找(本人理解),只不过二分查找是直接找寻中间位置的元素,然后比较大小,而快速排序则是经过前后不停的遍历数组,从而找到元素的落脚点,并把元素放在该位置(该位置不一定是中间位置,但是该元素的前面全部小于该元素,后面全部大于该元素)上,然后在以该元素为界分为前后两个部分,重复上述操作,至最后得出结果,具体Java代码(本代码采用升序排列)实现如下所示...原创 2018-08-26 20:09:34 · 290 阅读 · 0 评论 -
排序算法之归并排序
归并排序的思想:采用递归,将大数组划分为若干个小数组,进行各自的排序然后将各个小数组之间归并排序,最后对整个数组排序,划分数组的方法是采用一分为二平均分的原则,本算法是按升序排列,具体Java代码实现如下所示:public class MergeSort { public void mergeSort(int[] array,int left,int right){ ...原创 2018-08-26 21:44:26 · 124 阅读 · 0 评论 -
排序算法之基数排序
基数排序思想:基数排序的实现,是将原数组中的数值,分别按照个位,十位,百位......等的数值依次分组,比如,先按照个位数值分组,将原数组的元素按照个位数字进行依次分配,然后将分配好的元素,依次按照个位数字的大小依次存入到原数组中,然后再将该数组按照十位,百位....上的数字分组,最终实现排序,具体的Java代码实现如下所示:import java.util.ArrayList;impor...原创 2018-08-27 10:03:58 · 890 阅读 · 0 评论 -
运用递归的集中算法:最大公约数,阶乘,汉诺塔,倒酒
1,最大公约数/** * 欧几里得算法(求两个正整数的最大公约数) */public class Gcd { public int gcd(int m,int n){ int max=m; if (m<n){ max=n; n=m; m=max; } ...原创 2018-08-30 21:41:31 · 181 阅读 · 0 评论 -
回溯法
回溯法解决八皇后问题,具体Java代码实现如下所示:/** * 回溯法(八皇后) */public class EightQueen { public static int num=0;//累计可行方案 public static final int MAXQUEEN=8; public static int[] cols=new int[MAXQUEEN];/...原创 2018-08-31 22:10:34 · 152 阅读 · 0 评论 -
动态规划
匹配字符串中最长公共序列长度,具体的代码实现如下所示:/** * (动态规划)最长公共序列长度 */public class LCS { public int lcs(String A,String B){ int m=A.length(); int n=B.length(); char[] a=A.toCharArray();...原创 2018-08-31 22:09:03 · 89 阅读 · 0 评论 -
分治法
分治法解决循环赛,即观察矩阵的规律,采用分治法,将大矩阵分为小矩阵,分解至最小部分计算(运用到递归的策略),具体的Java代码实现如下所示:/** * 分治法解决球赛的循环赛 */public class Divide { public void divide(int[][] tab,int n){ if (n==1){ tab[0][0...原创 2018-08-31 10:52:08 · 525 阅读 · 0 评论 -
判断字符数组中是否所有的字符都只出现过一次
题目:给定一个字符型数组chs[],判断chs中是否所有的字符都只出现过一次,请根据以下不同的两种要求实现两个函数。要求: 1,实现时间复杂度为O(N)的方法。 2,在保证额外空间复杂度为O(1)的前提下,请实现时间复杂度尽量低的方法。要求1答案:因为题目的要求的时间复杂度为O(N),可知遍历一遍字符数组即可,并不需要考虑额外空间复杂度,可以定义一个布尔...原创 2018-12-19 10:09:35 · 838 阅读 · 0 评论