java算法模型汇总
算法找到根源,他是怎么想的。
其他技术的根源,为什么会发明这种方法,什么地方会使用到。
自己做算法:建立模型,把问题想清楚了可以通过模型具体问题,然后通过一定的技术和方法将模型中的问题具体的实现。
鼻炎:病毒怎么使得鼻子不通的。
买肉吃 买一份肉送C张优惠券,凑够P份送一份肉,新店开业一个月用优惠券买肉还送一份优惠券,小明两个月用M元买肉,少吃多少。每份肉价格x,送c张优惠券,p张换一份肉。 模型思想:吃蛋糕,大蛋糕可以被几个人吃,小蛋糕可以被几个人吃的问题。
移动坐标 正方形格子,边长N UDLR 初始坐标x,y 第一行向上移动将移动到第N行,左边第一列向左移动指向右边第一列,右边第一列向右指向坐标第一列,最后一行向下移动第一行,N方格长度,M移动部属,X,Y坐标以及移动序列。 模型思想,念珠移动,绳子的总长度是一定的,上下移动绳子上的念珠,念珠在绳子上的相对位置会发生变化,左右移动同理。
玩牌 玩牌N张牌每一张牌有一个对应分值,M个人围在一起玩牌,顺时针每轮发完牌数剩余的牌书,当剩余的牌不足一轮的时候,游戏结束,输出总分数和最大玩家的分数。 模型思想:领奖台排名,多轮考核,最后综合素质领奖台展示。
选择排序 整个范围找到最小的然后交换到第一个位置,之后在剩余的位置找最小的值然后放到第二个位置,依次类推。 模型思想:按各自高低进行排队,小个站前面,没办法像显示中扫一眼就知道位置。
根源:前面的有序,后面剩余的无序。
提示:前面的都有序怎么实现(for( int i = 0 ; i < n ; i ++ ) int minIndex = i; for( int j = i + 1 ; j < n ; j ++ ) if( arr[j] < arr[minIndex] ) minIndex = j;) 后面剩余的无序(swap( arr , i , minIndex);)
优化的选择排序 模型思想:吃东西先把最好吃的肉吃完,然后吃菜,吃面,把同一种素材分开,吃一块少一块。
根源:两边都是有序的,中间是无序的
提示:两边都是有序的(int left = 0,right=arr.length-1; while(left0 swap(arr,minIndex,maxIndex);中间是无序的(for(int i=left+1;i0 minIndex = i; arr[i].compareTo(arr[right]) 0 && arr[j-1].compareTo(e) > 0 arr[j] = e;)小方向也是从前往后的推进(for( int j = i ; j > 0 ; j -- ) arr[j].compareTo( arr[j-1] ) < 0 swap( arr, j , j-1 ); arr[j] = arr[j-1];)
冒泡排序 相邻的两个数进行比较,如果前面比后面大则互换位置,然后比较第二个和第三个数,直到最后。第一次比较之后最大的数就已经排在了最后。 模型思想:工厂上的流水线,一步一个操作重复式的机械操作
根源:拉拉链,从头开始,从低向上相互支撑
提示:从头开始(boolean swapped = false; do{ }while(swapped); n --; newn = 0; newn = i; n = newn;)从低向上相互支撑(swapped = false; for( int i = 1 ; i < n ; i ++ ) if( arr[i-1].compareTo(arr[i]) > 0 ) swap( arr , i-1 , i ); swapped = true; )
希尔排序 通过增加一个增量序列,增量序列先间隔比较大,然后增量序列慢慢减小间隔越来越小 模型思想:一个国家有很多的省份也有省长,然后又分为东南、西北
根源:复杂问题简化成简单的问题,简单的问题简化成更简单的问题
提示:复杂问题简化成简单的问题(int h = 1; while (h < n/3) h = 3*h + 1; while (h >= 1) { h /= 3;)简单的问题简化成更简单的问题(for (int i = h; i < n; i++) {Comparable e = arr[i]; int j = i; for ( ; j >= h && e.compareTo(arr[j-h]) < 0 ; j -= h)arr[j] = arr[j-h]; arr[j] = e; } Math.floor(-10.4));//-11.0 Math.round(-10.7));//-11)
归并排序
根源:分的足够细小自然有序,对有序的进行排列
提示:分的足够细小自然有序(sort(Comparable[] arr) sort(arr, 0, n-1); if (l >= r) return; int mid = (l+r)/2; sort(arr, l, mid); sort(arr, mid + 1, r);)对有序的进行排列(merge(arr, l, mid, r); Comparable[] aux = Arrays.copyOfRange(arr, l, r+1); int i = l, j = mid+1; for( int k = l ; k mid ) arr[k] = aux[j-l]; j ++; else if( j > r ){ arr[k] = aux[i-l]; i ++;} else if( aux[i-l].compareTo(aux[j-l]) < 0 arr[k] = aux[i-l]; i ++; arr[k] = aux[j-l]; j ++;)