这是要解决的问题:
约翰今天被分配了一项新任务。他得到一个包含 N 个整数的数组 A。他的任务是将数组的所有元素更新为某个最小值x,也就是说,A[i] = x; 1 <= i <= N;
使得这个新数组的总和严格大于初始数组的总和。 请注意,x 应尽可能小,以便新数组的总和大于初始数组的总和。
输入格式:输入的第一行由一个整数 N 组成,表示数组 A 中的元素数。
第二行由 N 个空格分隔的整数组成,表示数组元素。
输出格式:唯一的输出行由 x 的值组成。
示例输入:
5
12345
样本输出:4解释:
数组的初始和= 1 + 2 + 3 + 4 + 5 = 15
当我们将所有元素更新为 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");
}
}
问题:
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。
我将分享我的想法,我将如何做到这一点。
方法1
- 像你一样对所有元素求和。
- 现在,取元素的平均值 - 数组的总和/大小。假设我们将其存储在 变量
average
. - 打印平均值 + 1作为您的答案,因为这是可以为您提供数组本身总和>最小可能总和的值。
时间复杂度: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(
不确定我是否完全遵循了您的尝试,但应该有一个非常简单的解决方案。您知道数组的大小,并且可以轻松地遍历数组以获取存储在其中的元素的值。要找到您的最小值x,您需要做的就是获取数组的sumOfArray/大小,然后将一个添加到结果中以使结果更高。
在你的例子中 15/5=3. 3+1 = 4 所以这就是你的答案。如果数字总和为 43,43/5 = 8 r 3,那么您的答案是 9 (9*5=45(。等。
当尝试其他一些测试用例时,结果是错误的。尝试:
输入:
5
1 1 1 1 5
预期输出:2
实际输出:4
和
输入:
5
5 5 5 5 5
预期输出:6
实际输出:0