洛谷——爱与愁的心痛

题目链接:爱与愁的心痛

思路一:在读取数据时,更新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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值