题目链接:爱与愁的心痛
思路一:在读取数据时,更新min的值,我这里是通过设置左右边界,随着数据的加入,左右边界逐渐右移,更新每一次区间的总和sum,并更新min的值,结果发现最后复杂度还是O(n×m)
java代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n,m;
int min = 0;
int left = -1,right = -1;
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int arr[] = new int[n+1];
Arrays.fill(arr, 0);
for(int i=1;i<=n;++i) {
arr[i] = in.nextInt();
if(i==m) {
left = 1;
right = m;
for(int j=left;j<=right;++j)
min+=arr[j];
}
if(i>m&&i<=n) {
left++;
right++;
int sum = 0;
for(int j=left;j<=right;++j)
sum+=arr[j];
if(sum<min)
min = sum;
}
}
System.out.println(min);
}
}
思路二:对上面的思路进行优化,不需要每一次都通过遍历m次来求sum,实际上sum只需要加上新加入数组的数据,减掉此时区间最前面的数据,就可以完成sum的更新了。这样改进后,时间复杂度为O(n)。
java代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n,m;
int min = 0,sum=0;
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int arr[] = new int[n+1];
Arrays.fill(arr, 0);
for(int i=1;i<=n;++i) {
arr[i] = in.nextInt();
if(i<=m) {
min+=arr[i];
sum+=arr[i];
}
else {
sum = sum-arr[i-m]+arr[i];
if(sum<min)
min = sum;
}
}
System.out.println(min);
}
}