分享leetcode第1588题时间复杂度为O(n)的解法(所用语言为Java)

目录

一.题目

二.解法

三.测试结果


一.题目

1588.所有奇数长度子数组的和

给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

子数组 定义为原数组中的一个连续子序列。

请你返回 arr 中 所有奇数长度子数组的和 。

二.解法

时间复杂度为O(n)的解法:

class Solution {
    public int sumOddLengthSubarrays(int[] arr) {
        int sum = 0;
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            //得到arr[i]左边的数的数量和右边的数数量
            int leftCount = i, rightCount = n - i - 1;
            //得到在arr[i]左边(包括arr[i])下标为奇数的数的数量
            int leftOdd = (leftCount + 1) >> 1;
            //得到在arr[i]右边(包括arr[i])下标为奇数的数的数量
            int rightOdd = (rightCount + 1) >> 1;
            //得到在arr[i]左边(包括arr[i])下标为偶数的数的数量
            int leftEven = (leftCount >> 1) + 1;
            //得到在arr[i]右边(包括arr[i])下标为奇数的数的数量
            int rightEven = (rightCount >> 1) + 1;
            /*
                arr[i]左边(包括arr[i])下标为奇数的点和arr[i]右边(包括arr[i])下标为奇数的点组合
                加上arr[i]左边(包括arr[i])下标为偶数的点和arr[i]右边(包括arr[i])下标为偶数的点组合
                即得到arr[i]在所有奇数长度子数组中出现的总次数
                将arr[i]与arr[i]在所有奇数长度子数组中出现的总次数相乘
                即得到arr[i]对所有奇数长度子数组的和的贡献
            */
            sum += arr[i] * (leftOdd * rightOdd + leftEven * rightEven);
        }
        return sum;
    }
}

三.测试结果

 

分享leetcode第1588题时间复杂度为O(n)的解法(所用语言为Java)_第1张图片

你可能感兴趣的:(孙旭的Java学习经历,leetcode,java,算法)