zoukankan      html  css  js  c++  java
  • 413. 等差数列划分(暴力)

    1. 题目

    数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。

    如果满足以下条件,则称子数组(P, Q)为等差数组:

    元素 A[P], A[p + 1], ..., A[Q - 1], A[Q] 是等差的。并且 P + 1 < Q 。

    函数要返回数组 A 中所有为等差数组的子数组个数

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/arithmetic-slices
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2. 示例

    A = [1, 2, 3, 4]

    返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]

    3. 题解

    本题需要注意的几个地方:
    * 1. 子等差数组一定要相邻
    * 2. 满足等差
    * 因此本题只要固定第一个元素,然后遍历后面所有数,* 只要满足都sum+1; 否则,退出当前循环。

    4. Code

    4.1 暴力

     1 public class NumberOfArithmeticSlices {
     2     public int numberOfArithmeticSlices(int[] nums) {
     3         /**
     4          * 思想:暴力
     5          * 题解:
     6          * 本题需要注意的几个地方:
     7          * 1. 子等差数组一定要相邻
     8          * 2. 满足等差
     9          * 因此本题只要固定第一个元素,然后遍历后面所有数,
    10          * 只要满足都sum+1; 否则,退出当前循环。
    11          */
    12         int sum = 0;
    13         for(int i = 0; i < nums.length - 2; i++) {
    14             int curId = 1, temp = nums[i + 1] - nums[i];
    15             for(int j = i + 2; j < nums.length; j++) {
    16                 if(temp * curId + nums[i + 1] == nums[j]) {
    17                     curId++;
    18                     sum++;
    19                 } else {
    20                     break;
    21                 }
    22             }
    23         }
    24         return sum;
    25     }
    26     
    27     public static void main(String[] args) {
    28         int[] nums = {1, 2, 3, 4, 5, 6};
    29         System.out.println(new NumberOfArithmeticSlices().numberOfArithmeticSlices(nums));
    30     }
    31 }

     4.2 动态规划

     1 public int numberOfArithmeticSlicesB(int[] nums) {
     2         /**
     3          * 思想:动态规划
     4          * 题解:
     5          * 是暴力法的反向
     6          * 这里dp[i]存储的是以i结尾的子等差数列数,
     7          * 所以还需要一个sum来保存所有的数。
     8          */
     9         int[]dp = new int[nums.length];
    10         int sum = 0;
    11          for(int i = 2; i < nums.length; i++) {
    12              if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {
    13                  dp[i] = dp[i - 1] + 1;
    14                  sum += dp[i];
    15              }
    16          }
    17          return sum;
    18     }

     4.3 动态规划优化

     1  public int numberOfArithmeticSlicesC(int[] nums) {
     2         /**
     3          * 思想:动态规划
     4          * 题解:
     5          * 是动态规划的优化,第i个dp[i]只用到了dp[i-1]
     6          * 所以可以替换
     7          */
     8         int sum = 0;
     9         int temp = 0;
    10         for(int i = 2; i < nums.length; i++) {
    11             if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {
    12                 temp = temp + 1;
    13                 sum += temp;
    14             } else {
    15                 temp = 0;
    16             }
    17         }
    18         return sum;
    19     }
  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/haifwu/p/14815517.html
Copyright © 2011-2022 走看看