这是要解决的问题:
约翰今天被分配了一项新任务。给他一个包含N个整数的数组A。他的任务是将数组的所有元素更新为某个最小值x,即A[i] = x; 1 <= i <= N;
,以使此新数组的总和严格大于初始数组的总和。
请注意,x应该尽可能小,以使新数组的总和大于初始数组的总和。
输入格式: 输入的第一行包含一个整数N,该整数N表示数组A中的元素数。
第二行由N个以空格分隔的整数组成,表示数组元素。
输出格式: 输出的唯一行由x的值组成。
示例输入:
5
12345
示例输出: 4 说明:
数组的初始总和= 1 + 2 + 3 + 4 + 5 = 15
将所有元素更新为4时,数组的总和= 4 + 4 + 4 + 4 + 4 + 4 = 20,大于15。
请注意,如果我们已将数组元素更新为3,则sum = 15,该值不大于15。因此,4是需要更新数组元素的最小值。
** ==>这是我的代码。我该如何改善?或这段代码有什么问题? **
import java.util.Scanner;
public class Test2 {
public static void main(String []args){
Scanner s=new Scanner(System.in);
int check=0, sum=0, biggest=0;
int size=s.nextInt();
if(size>=1 && size<=100000) {
int[] arr=new int[size];
for(int i=0; i<size; i++){
int temp=s.nextInt();
if(temp>=1 && temp<=1000) {
arr[i] = temp;
biggest=biggest > temp ? biggest:temp;
sum=sum+temp;
}
else break;
}
for(int i=1; i<biggest; i++){
check=(size*i)>sum ? i:0;
}
System.out.print(check);
}
else System.err.print("Invalid input size");
}
}
答案 0 :(得分:1)
不确定我是否完全遵循您的尝试,但是应该有一个非常简单的解决方案。您知道数组的大小,可以轻松地遍历数组以获取存储在其中的元素的值。找到最小值x所需要做的就是取sumOfArray / array的大小,然后在结果中加1以使结果更高。
在您的示例中15/5 = 3。 3 + 1 = 4,这就是您的答案。如果数字总和为43、43 / 5 = 8 r 3,那么您的答案是9(9 * 5 = 45)。等等
答案 1 :(得分:1)
问题:
for(int i=1; i<biggest; i++){
check=(size*i)>sum ? i:0;
}
有2
个问题,因此不起作用。它们如下-
(size*i)>sum ? i
-问题声明指出,它需要的最小可能总和大于元素数组的总和。您的代码盲目地将i
分配给check
,而无需检查最小值。
check=(size*i)>sum ? i
:0 -因此,即使遇到整数previously
,也会丢失它,因为您已将其分配给 0 < / strong>,如果不满足条件。
我将分享我的想法。
方法1
average
中。 时间复杂度: O(n),其中n
是数组的大小。
空间复杂度: O(1)
方法2
mini
和maxi
。 mini
和maxi
之间进行二进制搜索,并继续检查minimum sum > sum
条件。 在此过程中,您将拥有low
,mid
和high
之类的变量。
low = mini,high = maxi
while low <= high:
mid = low + (high - low) / 2
If mid * size <= sum,
low = mid + 1
else
high = mid - 1
现在,打印low
作为答案。
让range
= maxi
-mini
。
时间复杂度:渐近地,O(n)+ O(log(range))= O(n),其中n
是数组的大小。
空间复杂度: O(1)
答案 2 :(得分:0)
尝试其他测试用例时,结果是错误的。试试:
输入:
5
1 1 1 1 5
预期输出: 2
实际输出: 4
和
输入:
5
5 5 5 5 5
预期输出: 6
实际输出: 0