无序数组找出数组中的最大和最小值
题目
给定一个无序数组找出数组中的最大和最小值
思路
方法1:蛮力法
定义两个遍历保存最大和最小值max,min初始值为数组的第一个元素然后从1开始遍历查找;
下面就看代码实现:
public static int [] findArrMinAndMax(int[] arr){
if (arr.length==0) return new int[]{0,0};
if (arr.length==1) return new int[]{arr[0],arr[0]};
int min=arr[0];
int max=arr[0];
for (int i = 1; i <arr.length ; i++) {
if (arr[i]>max){
max=arr[i];
}
if (arr[i]<min){
min=arr[i];
}
}
return new int[]{max,min};
}
测试代码:
int[] max = findArrMinAndMax(new int[]{3,7,19,40,7,4,1});
System.out.print("数组的最大值为:"+max[0]);
System.out.print("\n数组的最小值为:"+max[1]);
结果:
数组的最大值为:40
数组的最小值为:1
Process finished with exit code 0
方法2:分组法
两两一组分组例{3,7,19,40,7,4}把小的数放在左边大的放在右边为 {3,7,19,40,4,7}遍历数组在{3,19,4}中找出最小值{7,40,7}找出最大值注意数组为奇数是需要再次比较最大值和最小值
下面就看代码实现:
public static int [] findArrMinAndMax(int[] arr){
if (arr.length==0) return new int[]{0,0};
if (arr.length==1) return new int[]{arr[0],arr[0]};
int min=arr[0];
int max=arr[0];
int len=arr.length;
for (int i = 0; i <len-1 ; i+=2) {
if (arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
//遍历奇数下标的
min=arr[0];
for (int i = 2; i < len; i+=2) {
if (min>arr[i]){
min=arr[i];
}
}
//遍历偶数下标的
max=arr[1];
for (int i = 3; i < len; i+=2) {
if (max<arr[i]){
max=arr[i];
}
}
//如果数组的长度为奇数需要比较最后的大小
if (len%2==1){
if (max<arr[len-1]){
max=arr[len-1];
}
if (min>arr[len-1]){
min=arr[len-1];
}
}
return new int[]{max,min};
}
测试代码:
int[] max = findArrMinAndMax(new int[]{3,7,19,40,7,4,1});
System.out.print("数组的最大值为:"+max[0]);
System.out.print("\n数组的最小值为:"+max[1]);
结果:
数组的最大值为:40
数组的最小值为:1
Process finished with exit code 0
方法1:分治法
把大数组一值拆分为直到子数组中只存在一个或者两个数的时候就是递归的出口;
下面就看代码实现:
public static List<Integer> findArrMinAndMax(int[] arr, int f, int l){
int min;
int max;
//把数组拆分成子数组
int m=(f+l)/2;
//用来保存子数组的最大值和最小值
ArrayList<Integer> list=new ArrayList<>();
//数组中只包含一个数
if (f==l){
list.add(arr[f]);
list.add(arr[f]);
return list;
}
//数组中只包含两个数
if (f+1==l){
if (arr[f]>=arr[l]){
max=arr[f];
min=arr[l];
}else {
max=arr[l];
min=arr[f];
}
list.add(min);
list.add(max);
return list;
}
List<Integer> llist = findArrMinAndMax(arr, 1, m);
List<Integer> rlist = findArrMinAndMax(arr, m + 1, l);
max=(llist.get(1)>rlist.get(1))? llist.get(1):rlist.get(1);
min=(llist.get(0)<rlist.get(0)) ? llist.get(0):rlist.get(0);
list.add(min);
list.add(max);
return list;
}
测试代码:
List<Integer> list = findArrMinAndMax2(new int[]{3, 7, 19, 40, 7, 4, 1}, 0, new int[]{3, 7, 19, 40, 7, 4, 1}.length - 1);
System.out.print("\n数组的最大值为:"+list.get(1));
System.out.print("\n数组的最小值为:"+list.get(0));
结果:
数组的最大值为:40
数组的最小值为:1
Process finished with exit code 0
三种方法都可以解决问题时间复杂度更好