无序数组找出数组中的最大和最小值

无序数组找出数组中的最大和最小值

题目

给定一个无序数组找出数组中的最大和最小值

思路

方法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

三种方法都可以解决问题时间复杂度更好

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值