How to find max. and min. in array using minimum comparisons?

后端 未结 14 1417
深忆病人
深忆病人 2020-12-04 09:08

This is a interview question: given an array of integers find the max. and min. using minimum comparisons.

Obviously, I can loop over the array twice and use ~

相关标签:
14条回答
  • 2020-12-04 09:21
    import java.util.*;
    class Maxmin
    {
        public static void main(String args[])
        {
            int[] arr = new int[10];
            Scanner in = new Scanner(System.in);
            int i, min=0, max=0;
            for(i=0; i<=9; i++)
            {
                System.out.print("Enter any number: ");
                arr[i] = in.nextInt();          
            }
            min = arr[0];
            for(i=0; i<=9; i++)
            {
                if(arr[i] > max)
                {
                    max = arr[i];
                }
                if(arr[i] < min)
                {
                    min = arr[i];
                }
            }
            System.out.println("Maximum is: " + max);
            System.out.println("Minimum is: " + min);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 09:23
    1. Pick 2 elements(a, b), compare them. (say a > b)
    2. Update min by comparing (min, b)
    3. Update max by comparing (max, a)
    

    This way you would do 3 comparisons for 2 elements, amounting to 3N/2 total comparisons for N elements.

    0 讨论(0)
  • 2020-12-04 09:23
    if (numbers.Length <= 0)
    {
        Console.WriteLine("There are no elements");
        return;
    }
    
    if (numbers.Length == 1)
    {
        Console.WriteLine($"There is only one element. So min and max of this 
                            array is: {numbers[0]}");
        return;
    }
    
    if (numbers.Length == 2)
    {
        if (numbers[0] > numbers[1])
        {
            Console.WriteLine($"min = {numbers[1]}, max = {numbers[0]}");
            return;
        }
    
        Console.WriteLine($"min = {numbers[0]}, max = {numbers[1]}");
        return;
    }
    
    int i = 0;
    int j = numbers.Length - 1;
    
    int min = numbers[i];
    int max = numbers[j];
    i++;
    j--;
    
    while (i <= j)
    {
        if(numbers[i] > numbers[j])
        {
            if (numbers[j] < min) min = numbers[j];
            if (numbers[i] > max) max = numbers[i];
        }
        else
        {
            if (numbers[i] < min) min = numbers[i];
            if (numbers[j] > max) max = numbers[j];
        }
        i++;
        j--;
    }
    

    It's a solution written in C#. I find this method of burning the candle at both ends to be a good contender as a solution.

    0 讨论(0)
  • 2020-12-04 09:25

    My divide & conquer approach with java so far:

            public class code {    
        static int[] A = {444,9,8,6,199,3,0,5,3,200};
        static int min = A[0], max = A[1];
        static int count = 0;
    
        public void minMax(int[] A, int i, int j) {     
            if(i==j) {
                count = count + 2;
                min = Math.min(min, A[i]);
                max = Math.max(max, A[i]);
            }
    
            else if(j == i+1) {
                if(A[i] > A[j]) {
                    count = count + 3;
                    min = Math.min(min, A[j]);
                    max = Math.max(max, A[i]);
                }
                else {
                    count = count + 3;
                    min = Math.min(min, A[i]);
                    max = Math.max(max, A[j]);
                }
            }
    
            else {
                minMax(A,i,(i+j)/2);
                minMax(A,(i+j)/2+1,j);
            }
        }
    
        public static void main(String[] args) {
            code c = new code();
            if(Math.min(A[0], A[1]) == A[0]) {
                count++;
                min = A[0];
                max = A[1];
            }
            else {
                count++;
                min = A[1];
                max = A[0];
            }
            c.minMax(A,2,A.length-1);
            System.out.println("Min: "+min+" Max: "+max);
            System.out.println("Total comparisons: " + count);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 09:27

    Just loop over the array once, keeping track of the max and min so far.

    0 讨论(0)
  • 2020-12-04 09:28
    public static int[] minMax(int[] array){
        int [] empty = {-1,-1};
        if(array==null || array.length==0){
            return empty;
        }
    
        int lo =0, hi = array.length-1;
        return minMax(array,lo, hi); 
    
    }
    
    private static int[] minMax(int []array, int lo, int hi){
    
        if(lo==hi){
            int [] result = {array[lo], array[hi]}; 
            return result;
        }else if(lo+1==hi){
            int [] result = new int[2];
            result[0] = Math.min(array[lo], array[hi]);
            result[1] = Math.max(array[lo], array[hi]);
            return result;
        }else{
            int mid = lo+(hi-lo)/2;          
            int [] left = minMax(array, lo, mid);
            int [] right = minMax(array, mid+1, hi);
            int []result = new int[2];          
            result[0] = Math.min(left[0], right[0]);
            result[1] = Math.max(left[1], right[1]);             
            return result;
        }
    
    }
    
    public static void main(String[] args) {
    
        int []array = {1,2,3,4,100};
        System.out.println("min and max values are "+Arrays.toString(minMax(array)));
    }
    
    0 讨论(0)
提交回复
热议问题