运用分治法实现最大值次大值和数字旋转方阵
一、分治法之最大值次大值
【最大和次大值问题描述】
对于给定的含有n个元素的无序序列,求这个序列中最大和次大的两个元素。
【程序代码】
import java.util.Scanner;
public class text1cankao {
static int a[];//数组
static int inf = -999999;// 负无穷
//两数算最大值
static int max(int a,int b){
return a > b ? a : b;
}
//两数最小值
static int min(int a, int b){
return a > b ? b : a;
}
// 最大值,次大值
static class max{
int max1,max2;
}
//分治法函数
static max solve(int low, int high){
max m = new max();
if (low == high) // 区间中只有一个元素
{
m.max1 = a[low];
m.max2 = inf;
} else if (low == high - 1) // 区间中有两个元素
{
m.max1 = max(a[low], a[high]);
m.max2 = min(a[low], a[high]);
}
else //两个元素以上
{
int mid = (low + high) / 2;
max l = solve(low, mid);// l为左区间
max r = solve(mid + 1, high);// r为右区间
if (l.max1 > r.max1) //求次大元素
{
m.max1 = l.max1;
m.max2 = Math.max(l.max2, r.max1);
} else {
m.max1 = r.max1;
m.max2 = Math.max(r.max2, l.max1);
}
}
return m;
}
public static void main(String args[]) {
System.out.println("请输入数组的长度");
Scanner sa= new Scanner(System.in);
int i = sa.nextInt();
a = new int[i];
for(int j = 0; j<i; j++){ //手动输入数组
System.out.println("请输入数组的第"+ (j+1) + "个数");
int sum = sa.nextInt();
a[j] = sum;
}
max m = solve(0, i-1); //调用分治法
System.out.println("最大值为:" + m.max1 + "\n次大值为: " + m.max2);
}
}
【运行结果】
二、分治法之输出数字旋转方阵
【数字旋转方阵题目】
数字旋转方阵如下图所示:
从下图可以看出,从左上角开始,逆时针放置每次增加1的数字,直到“旋转”到最里层终止。
【程序代码】
import java.util.Scanner;
public class text2rotate2{
public static int N ;
int [][] result = new int[N][N];
public static void main(String[] args) {
System.out.println("请输入数字旋转方阵宽度:");
Scanner b= new Scanner(System.in);
N = b.nextInt(); //控制输入方陈长度。
text2rotate2 rm = new text2rotate2();
rm.Rotate(1, 0, N); //
rm.printResult(); //打印
}
//生成旋转矩阵
public void Rotate(int number, int begin, int size){
if(size == 1){
result[begin][begin] = number;
return;
}
if(size == 0){
return;
}
int i = begin;
int j = begin;
for(int k = 0; k < size - 1; k++){
result[i][j] = number;
number++;
i++;
}
for(int k = 0; k < size - 1; k++){
result[i][j] = number;
number++;
j++;
}
for(int k = 0; k < size - 1; k++){
result[i][j] = number;
number++;
i--;
}
for(int k = 0; k < size - 1; k++){
result[i][j] = number;
number++;
j--;
}
Rotate(number, begin + 1, size - 2);
}
//打印结果
public void printResult(){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
System.out.print(" " + result[i][j] + " ");
if(j == N - 1){
System.out.println();
}
}
}
}
}
【运行结果】
程序运行结果图: