413. Arithmetic Slices

本文介绍了一道LeetCode上的等差数列切片问题,并提供了两种解决方案:一种是暴力解法,另一种是更高效的动态规划方法。通过对示例的详细解析,帮助读者理解如何计算数组中等差数列的数量。

PS:说好的一天一道leetcode,前天停电,今天打算补3道,昨天其实还写了一道,太简单,就没有往博客上放。

A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.

For example, these are arithmetic sequence:

1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

The following sequence is not arithmetic.

1, 1, 2, 5, 7

A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.

A slice (P, Q) of array A is called arithmetic if the sequence:
A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.

The function should return the number of arithmetic slices in the array A.


Example:

A = [1, 2, 3, 4]

return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.

这个题目死长死长的,其实就是说,让你计算一个数组里面有多少个算数级数,就是等差数列,长度最少为3,最长为数组长度,然后就没有了。

1.先来暴力解法,我在本子上写好伪代码,然后照着敲上去,一次AC。就是效率有点低。

代码如下:

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        if(A.size() < 3)
            return 0;
        
        const int n = A.size();
        int count = 0;
        
        for(int k=3; k<=n; ++k){
            for(int i=0; i<=n-k; ++i){
                int s = A[i+1] - A[i];
                int j = 2;
                while(j < k){
                    if(A[i+j] - A[i+j-1] != s)
                        break;
                    ++j;
                }
                if(j == k && A[i+j-1] - A[i+j-2] == s)
                    ++count;
            }
        }
        return count;
    }
};



2.DP

其实DP的思想很简单,可是我开始就是没有想到,也往DP方向想了,但是没有思路。

比如: 1 2 3 4 5

下标i从0开始,当i为2时,初始状态有一组算术级数,123。

                        当i为3时,算数级数有:1234,234

当i为4时,算数级数有:12345,2345,345

通过上面规律不难发现,每次新增加一个元素,都是先在已有元素的基础上append上去,再加上自己新带来的长度为3的一组级数。

所以,dp[i] = dp[i-1] + 1,可以通过前期计算过的子问题来解决新问题,这不就是动态规划吗?

代码如下:

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


### 回答1: 这是Java中的一个异常,意思是需要进行四舍五入。通常是因为进行了除法运算,但结果不能被精确表示为一个整数或小数。解决方法是使用BigDecimal类进行精确计算,或者使用Math.round()方法进行四舍五入。 ### 回答2: java.lang.ArithmeticException: rounding necessary是Java中的一个异常。它表示在进行数值运算时,需要进行舍入操作。在Java中,当进行除法或四舍五入等运算时,如果结果不是一个整数,则需要进行舍入以获得最接近的整数或指定的小数位数。 这个异常通常发生在以下情况下: 1. 当进行除法运算时,如果除数不能整除被除数,则需要进行舍入才能得到结果。如果无法进行舍入操作,就会抛出该异常。 2. 当通过四舍五入方式将一个小数转换为整数或指定小数位数时,如果需要进行舍入操作才能得到结果,则会抛出该异常。 为了解决这个异常,我们可以采取以下措施: 1. 检查除法运算中的被除数和除数,确保能够整除,避免出现舍入错误。如果无法整除,则需要重新设计算法或找到其他解决方案。 2. 在进行四舍五入运算时,可以使用Java中的Math类提供的方法,如Math.round()来进行舍入操作。此外,还可以考虑使用BigDecimal类来处理精确的小数运算,它提供了很多可以进行舍入操作的方法。 总之,当我们在Java中遇到java.lang.ArithmeticException: rounding necessary异常时,表示在进行数值运算时需要进行舍入操作。要解决这个异常,我们需要检查除法运算中的被除数和除数,以及使用适当的方法进行舍入操作,保证结果的准确性。 ### 回答3: Java.lang.ArithmeticException: rounding necessary 是一个在Java中的异常类型。它表示在进行数值运算时需要进行四舍五入操作。 在进行数值运算时,可能会出现无法准确表示的结果,特别是涉及到浮点数和小数点的运算。由于计算机的内部表示方式有限,无法完美地表示所有的小数和浮点数。这就导致了某些运算结果的尾数部分可能无法精确表示,需要进行四舍五入操作。 当进行一个数值运算时,如果该运算需要进行四舍五入操作以确保结果的准确性,但是没有指示具体的四舍五入策略时,就会抛出 java.lang.ArithmeticException: rounding necessary 异常。 要解决这个异常,可以使用合适的四舍五入策略来确保数值运算的准确性。Java中提供了 BigDecimal 类来处理高精度的数值计算,它可以指定要使用的四舍五入策略。在进行数值运算时,可以使用 BigDecimal 类来处理数值,并指定需要使用的四舍五入策略,从而避免 java.lang.ArithmeticException: rounding necessary 异常的发生。 总之,解决 java.lang.ArithmeticException: rounding necessary 异常的方法是使用 BigDecimal 类来处理数值运算,并指定合适的四舍五入策略。这样可以确保数值运算的准确性,避免出现无法精确表示的结果导致的异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值