Upload
myxro
View
227
Download
0
Embed Size (px)
DESCRIPTION
java
Citation preview
Naive Solution
We can simply iterate through the array and compare twice to each element to get min and max. This leads to 2n comparisons.
//sudo codemax = A[0], min = A[0]for each i in A if A[i]>max then max = A[i] if A[i]<min then min = A[i]public static void minmax0(int[] a) {
if (a == null || a.length < 1)return;
int min = a[0];int max = a[0];
for (int i = 1; i <= a.length - 1; i++) {
if (max < a[i]) {max = a[i];
}
if (min > a[i]) {min = a[i];
}}
System.out.println("min: " + min + "\nmax: " + max);
}
# of comparisons: 2(n-1).
Apparently, we should do better than this.
Better Solution 1
public static void minmax1(int[] a) {
if (a == null || a.length < 1)return;
int min, max;
// if only one elementif (a.length == 1) {
max = a[0];min = a[0];System.out.println("min: " + min + "\nmax: " + max);return;
}
if (a[0] > a[1]) {max = a[0];min = a[1];
} else {max = a[1];min = a[0];
}
for (int i = 2; i <= a.length - 1; i++) {
if (max < a[i]) {max = a[i];
} else if (min > a[i]) {min = a[i];
}}
System.out.println("min: " + min + "\nmax: " + max);
}
# of comparisons in worst case: 1 + 2(n-2) = 2n -1# of comparisons in best case: 1 + (n–2) = n -1# of comparisons on average: 1.5n -1
In the above implementation, worst case occurs when elements are sorted in descending order, because every time max is greater than a[i] and the second condition always gets executed. The best case occurs when elements are sorted in ascending order, because every time max is less than a[i] and the second condition never gets executed.
Better Solution 2
The number of comparisons can be reduced by comparing pairs first:
public static void minmax2(int[] a) {if (a == null || a.length < 1)
return;
int min, max;
// if only one elementif (a.length == 1) {
max = a[0];min = a[0];System.out.println("min: " + min + "\nmax: " + max);return;
}
if (a[0] > a[1]) {max = a[0];min = a[1];
} else {max = a[1];min = a[0];
}
for (int i = 2; i <= a.length - 2;) {if (a[i] > a[i + 1]) {
min = Math.min(min, a[i + 1]);max = Math.max(max, a[i]);
} else {min = Math.min(min, a[i]);max = Math.max(max, a[i + 1]);
}
i = i + 2;}
if (a.length % 2 == 1) {
min = Math.min(min, a[a.length - 1]);max = Math.max(max, a[a.length - 1]);
}
System.out.println("min: " + min + "\nmax: " + max);}
# of comparisons when n is even: 1 + 3 * ((n-2)/2) = 1.5n-2.# of comparisons when n is odd: 1 + 3 * ((n-3)/2) + 2 = 1.5n
Better Solution 3
class Pair {int min;int max;
} public class Solution {
public static Pair getMinMax(int arr[], int low, int high) {Pair result = new Pair();Pair left = new Pair();Pair right = new Pair();
// if there is only one elementif (low == high) {
result.max = arr[low];result.min = arr[low];return result;
}
// if there are two elementsif (high == low + 1) {
if (arr[low] > arr[high]) {result.max = arr[low];result.min = arr[high];
} else {result.max = arr[high];result.min = arr[low];
}return result;
}
// if there are more than 2 elementsint mid = (low + high) / 2;left = getMinMax(arr, low, mid);right = getMinMax(arr, mid + 1, high);
if (left.min < right.min)
result.min = left.min;else
result.min = right.min;
if (left.max > right.max)result.max = left.max;
elseresult.max = right.max;
return result;}
public static void main(String[] args) {
int a1[] = { 3, 4, 2, 6, 8, 1, 9, 12, 15, 11 };Pair result = getMinMax(a1, 0, a1.length - 1);
System.out.println("Min: " + result.min);System.out.println("Max: " + result.max);
}}