413. Arithmetic Slices

 起初发现这道题很像子串问题,我们只需要求出每个连续的Slices的长度,然后计算每个连续Slices的子串个数即可。假设某个连续的串长度为N,那么它所包含的子串个数为

(N-1)*(N-2)/2,很简单的数学问题

	class Solution {
	public:
		int numberOfArithmeticSlices(vector<int>& A) {
			if (A.size() < 3)
				return 0;
			else
			{
				int j = 0;
				int num[100] = {};
				int dif = A[1] - A[0];
				int l = 2;
				for (int i = 2; i < A.size(); ++i)
				{
					if ((A[i] - A[i - 1]) == dif)
						l++;
					else
					{
						if (l>2)
							num[j++] = l;
						dif = A[i] - A[i - 1];
						l = 2;
					}

				}
				if (l>2)
					num[j++] = l;
				if (j == 0)
					return 0;
				else
				{
					int sum = 0;
					for (int i = 0; i < j; ++i)
						sum += (num[i] - 1)*(num[i] - 2) / 2;
					return sum;
				}
			}
		}
	};


    后来发现只击败了8%的人,觉得会有更好的方法,看了一下发现了下面这种动态规划,思想是连续的串每增加一个数字,那么子串个数就会加1,然后直接加到结果里面,其实和我上面的思路差不多,只不过我是把子串长度存在数组里面,最后再计算,这样的优点是知道有多少个连续子串,并且每个子串的长度都知道。然而这道题不需要,不过重新交了一下发现时间还是没变,可能是测试案例太小了吧。

class Solution {
public:
	int numberOfArithmeticSlices(vector<int>& A) {
		if (A.size() < 3)
			return 0;
		else
		{
			int sum = 0;
		vector<int>dp(A.size(), 0);
			int dif = A[1] - A[0];
			for (int i = 2; i < A.size();++i)
			if (A[i] - A[i - 1] == dif)
			{
				dp[i] = dp[i - 1] + 1;
				sum += dp[i];
			}
			else
				dif = A[i] - A[i - 1];
			return sum;
		}
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值