446. Arithmetic Slices II - Subsequence

446. Arithmetic Slices II - Subsequence
Arithmetic序列

题目:
给定一个数组,判断该数组中有多少Arithmetic子序列。
Arithmetic子序列定义为:长度大于2的,并且每相邻两个元素之间拥有相同的差值。
解题思路:
动态规划。
定义一个一维数组dp,dp中的元素为哈希表,这个哈希表是等差数列的差值和其长度之间的映射。
遍历数组中的所有数字nums[i](0<=i<n),对于当前遍历到的数字,从头开始遍历到当前数字nums[j](0<=j<i),计算两个数字之间的差值diff。如果diff越界,则不做任何处理;若diff没有越界,则将dp[i]中的diff的差值映射+1;然后看dp[j]中是否有diff的映射,若有,则构成等差数列,将dp[j][d]加入结果集中,更新dp[i][d]。
代码:
class Solution
{
    public int numberOfArithmeticSlices(int[] A) {
        if(A==null || A.length<=2) return 0;
        
        int result=0;
        HashMap<Integer,Integer>[] maps=new HashMap[A.length];
        
        for(int i=0;i<A.length;i++)
        {
        	maps[i]=new HashMap<Integer,Integer>();
        	for(int j=0;j<i;j++)
        	{
        		long diff=(long)A[i]-(long)A[j];
        		//判断是否越界
        		if(diff>Integer.MAX_VALUE || diff<Integer.MIN_VALUE) continue;
        		int d=(int) diff;
        		
        		// getOrDefault():从map对象里获取数据,如果没有数据则返回一个默认的值
        		int count=maps[j].getOrDefault(d, 0);
        		maps[i].put(d, maps[i].getOrDefault(d, 0)+count+1);
        		result+=count;
        	}
        }
        return result;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值