算法基本使用 最大公约数 最大公约数求取,使用欧几里得算法
若 mod(m,n)!=0 则 g(m,n) = g(n,mod(m,n))
若mod(m,n)=0 则g(m,n) = n
mod(m,n)表示m除n之后的余数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public int maxCommonDisvisor (int m, int n) { int temp = 0 ; if (m < n) { while (true ) { if (n % m == 0 ) { return m; } temp = n % m; n = m; m = temp; } } else { while (true ) { if (m % n == 0 ) { return n; } temp = m % n; m = n; n = temp; } } }
最大公约数还有个简单地方式,就是两个数中较大的数减去较小的数,反复执行,直到两个数相等
最小公倍数是两个数相乘,除以最大公约数
递推 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。 递推算法分为顺推和逆推两种
如 斐波那契数列
1 2 3 4 5 6 7 8 9 public void fs (int num) { int [] fs = new int [num]; fs[0 ] = 1 ; fs[1 ] = 1 ; for (int i = 2 ; i < num; i++) { fs[i] = fs[i - 1 ] + fs[i - 2 ]; } Arrays.stream(fs).forEach(System.out :: println); }
递归 递归算法是种很常见的算法,可以简化代码编写,提高程序可读性,其通过在程序中不断的反复调用自身来达到求解问题的方法
示例:进行进制转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void main (String[] args) { System.out.println(Integer.toBinaryString(10 )); StringBuilder stringBuilder = new StringBuilder(); tenToTwo(10 , stringBuilder); System.out.println(stringBuilder.reverse().toString()); } public static int tenToTwo (int ten, StringBuilder sb) { if (ten == 0 ) { return 0 ; } sb.append(ten % 2 ); return tenToTwo(ten / 2 , sb); }
分治 分治算法,分而治之,是一种化繁为简的算法,将问题简化逐步得到结果
穷举 穷举是最简单的一种算法,依赖于计算机的强大计算能力,穷尽每一种可能的情况,从而达到求解问题的目的,但是其效率并不高
如鸡兔同笼问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public static void main (String[] args) { System.out.println("鸡兔同笼问题" ); System.out.println("输入头数:" ); Scanner scanner = new Scanner(System.in); int head = scanner.nextInt(); System.out.println("输入脚数:" ); int foot = scanner.nextInt(); boolean result = qiongju(head, foot); if (result){ System.out.println("鸡" +chicken+"只,兔" +rabbit+"只" ); } else { System.out.println("无解" ); } } static int chicken,rabbit; public static boolean qiongju (int head,int foot) { boolean result = false ; for (int i = 0 ; i <= head;i++){ int j = head - i; if (i *2 + j * 4 == foot){ chicken = i; rabbit = j; result = true ; break ; } } return result; }
贪婪算法 贪婪算法不追求最优解,只希望得到较为满意解的方法,一般可以快速得到满意的解,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。通过局部最优选择来达到全局最优解。
找零钱示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class Main4 { int [] value = {10000 , 5000 , 2000 , 1000 , 500 , 200 , 100 , 50 , 20 , 10 , 5 , 2 , 1 }; public static void main (String[] args) { Main4 m = new Main4(); m.exchange(1748 ); } public void exchange (int n) { StringBuilder sb = new StringBuilder(); int m = 0 ; for (int i = 0 ; i < value.length; i++) { if (n < value[i]) { continue ; } m = n / value[i]; n = n - m * value[i]; if (value[i] > 100 ) { sb.append(m).append("张" ).append(value[i] / 100 ).append("元," ); } else if (value[i] > 10 ) { sb.append(m).append("张" ).append(value[i] / 10 ).append("角," ); } else { sb.append(m).append("张" ).append(value[i]).append("分," ); } } if (sb.indexOf("," ) > 0 && sb.lastIndexOf("," ) == sb.length() - 1 ) { sb.deleteCharAt(sb.length() - 1 ); } System.out.println(sb.toString()); } }
回溯算法 为了得到问题的解,先选择某一种可能情况进行试探,在试探过程中,一旦发现原本选择的假设情况是错误的,就退回一步选择,继续向另一个方向试探,如此反复,得到结果
八皇后示例