创建一个中位数数组。JAVA
我很难找到此练习的解决方案:创建一个中位数数组。JAVA,java,arrays,algorithm,loops,for-loop,Java,Arrays,Algorithm,Loops,For Loop,我很难找到此练习的解决方案: Given scores, an array of integers representing all test and assignment scores, your task is to return an array of integers where output[i] represents the median grade after all marks up to (and including) scores[i] have been entered.
Given scores, an array of integers representing all test and assignment scores, your task is to return an array of integers where output[i] represents the median grade after all marks up to (and including) scores[i] have been entered. Your instructor is a generous marker, so they always round the median up to the nearest integer.
median* - The median of an N-element sequence is defined as follows: If N is odd, the median is the element which stands in the middle of the sequence after it is sorted. If N is even, the median is the average (mean) of the two "middle" elements of the sequence after it is sorted.
Example
•For scores = [100, 20, 50, 70, 45] the output should be medianScores(scores) = [100, 60, 50, 60, 50].
After each score is entered, the median is recalculated as follows:
◦For [100], the median is 100 since it's the only element.
◦For [20, 100], the median is (20 + 100)/2 = 60 since there's an even number of elements.
◦For [20, 50, 100], the median is 50 (middle element).
◦For [20, 50, 70, 100], the median is (50 + 70)/2 = 60(mean of the two middle elements).
◦For [20, 45, 50, 70, 100], the median is 50 again (middle element).
Input / Output
我一直在试图得到一个有效的代码,到目前为止,如果数组的长度是奇数,那么代码是有效的,但是如果它是偶数,那么它将返回一个错误的结果
public static int[] getMedian(int[] arr){
int[] sortedArr = new int[arr.length];
int length = arr.length-1;
int odd = arr.length-1;
int even = arr.length-1;
for(int i=0;i<arr.length;i++) {
sortedArr[length] = arr[i];
Arrays.sort(sortedArr);
if (length % 2 == 0) {
arr[i] = sortedArr[odd];
odd--;
} else {
arr[i] = (sortedArr[even] + sortedArr[even - 1]) / 2;
even--;
}
length--;
}
return arr;
}
该算法的工作原理是将arr中的元素添加到分拣机中。元素被排序,然后它检查sortedar是偶数还是奇数。如果是偶数,则arr[i]成为中间元素;如果是奇数,则arr[i]是中间元素之和除以2
非常感谢您的帮助。将数组复制到SorterDarray时,您正在覆盖现有值
public static void main(String[] args) {
int[] ret = getMedian(new int[]{100,20,50,70,45});
System.out.println(Arrays.toString(ret));
}
public static int[] getMedian(int[] arr) {
int[] sortedArr = new int[arr.length];
int[] retArr = new int[arr.length];
int len = 1;
int realLength = arr.length-1;
for (int i = 0; i < arr.length; i++) {
sortedArr[realLength-i] = arr[i];
Arrays.sort(sortedArr);
// arrays are accessed in reverse so adjust is needed using
// array length.
if (len % 2 == 1) {
// use middle value
retArr[i] = sortedArr[realLength-len/2];
} else {
// average middle values
retArr[i] = (sortedArr[realLength-len/2]
+ sortedArr[realLength-len/2 + 1]) / 2;
}
len++;
}
return retArr;
}
}
将数组复制到SorterDarray时,您正在覆盖现有值
public static void main(String[] args) {
int[] ret = getMedian(new int[]{100,20,50,70,45});
System.out.println(Arrays.toString(ret));
}
public static int[] getMedian(int[] arr) {
int[] sortedArr = new int[arr.length];
int[] retArr = new int[arr.length];
int len = 1;
int realLength = arr.length-1;
for (int i = 0; i < arr.length; i++) {
sortedArr[realLength-i] = arr[i];
Arrays.sort(sortedArr);
// arrays are accessed in reverse so adjust is needed using
// array length.
if (len % 2 == 1) {
// use middle value
retArr[i] = sortedArr[realLength-len/2];
} else {
// average middle values
retArr[i] = (sortedArr[realLength-len/2]
+ sortedArr[realLength-len/2 + 1]) / 2;
}
len++;
}
return retArr;
}
}
非优化解 首先是一种仅计算阵列中值的方法: /**慷慨与否:一到四舍五入,零到四舍五入*/ 专用静态最终int=1; 专用静态int medianint[]arr{ a.sortarr; int mid=阵列长度/2; 如果mid+mid==arr.length{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 然后只需为每个子数组调用它: //传递的数组将被部分排序 私有静态int[]getMedianint[]arr{ int[]结果=新int[arr.length]; 对于int i=0;i
非优化解 首先是一种仅计算阵列中值的方法: /**慷慨与否:一到四舍五入,零到四舍五入*/ 专用静态最终int=1; 专用静态int medianint[]arr{ a.sortarr; int mid=阵列长度/2; 如果mid+mid==arr.length{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 然后只需为每个子数组调用它: //传递的数组将被部分排序 私有静态int[]getMedianint[]arr{ int[]结果=新int[arr.length]; 对于int i=0;i
为了提高效率,第一步是确定更好的算法 让我们调用创建的数组 我将使用两个堆: k/2或k/2+1最低值到第k个索引的最大剩余堆数,取决于k是偶数还是奇数。 k/2最高值的最小堆权限,最高可达第k个索引 那么
if k is even, median[k] = (left.max() + right.min())/2
if k is odd, median[k] = left.max()
初始化:
left <- min (scores[0], scores[1])
right <- max (scores[0], scores[1])
如果k为奇数:
全局复杂性:Onlogn
我不太懂java。如果java没有堆,我想您可以使用PriorityQueue 为了提高效率,第一步是确定更好的算法 让我们调用创建的数组 我将使用两个堆: k/2或k/2+1最低值到第k个索引的最大剩余堆数,取决于k是偶数还是奇数。 k/2最高值的最小堆权限,最高可达第k个索引 那么
if k is even, median[k] = (left.max() + right.min())/2
if k is odd, median[k] = left.max()
初始化:
left <- min (scores[0], scores[1])
right <- max (scores[0], scores[1])
如果k为奇数:
全局复杂性:Onlogn
我不太懂java。如果java没有堆,我想您可以使用PriorityQueue 如果数组的长度是偶数,那么它将断开,这是什么意思?我用偶数数组长度测试它,程序没有崩溃。你的意思是输出不正确吗?@djharten是的,结果不正确,我为糟糕的术语道歉,我还是新的。你需要将偶数和奇数除以2。此外,SorterDar中只有默认数据。我建议使用Arrays.copyOfRange从原始数组创建子数组,因为sort将始终对整个数组进行排序,包括尚未设置为零的元素,或者使用仅对范围进行排序的排序方法:但不在SorterDar[length]处添加元素,使用i表示Obs:偶数和奇数必须从i计算,子数组的大小在每次迭代时对数组排序似乎不是很有效。你对效率有什么限制吗?最大数组大小是多少?如果数组的长度是偶数,则表示什么?我正在用伊芙测试它
n个数组长度,程序不会崩溃。你的意思是输出不正确吗?@djharten是的,结果不正确,我为糟糕的术语道歉,我还是新的。你需要将偶数和奇数除以2。此外,SorterDar中只有默认数据。我建议使用Arrays.copyOfRange从原始数组创建子数组,因为sort将始终对整个数组进行排序,包括尚未设置为零的元素,或者使用仅对范围进行排序的排序方法:但不在SorterDar[length]处添加元素,使用i表示Obs:偶数和奇数必须从i计算,子数组的大小在每次迭代时对数组排序似乎不是很有效。你对效率有什么限制吗?最大阵列大小是多少?