LeetCode1480.一维数组的动态和

题目:一维数组的动态和
给你一个数组nums。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…num s[i]) 。
请返回 nums 的动态和。
注意:请使用自然语言、伪代码等描述算法的过程(自然语言必须要有,伪代码可选),必要的时候结合图形来描述过程。使用Java实现,代码粘贴到代码块中,并给出提交到LeetC ode的结果截图。最后分析算法的时间复杂度和空间复杂度。
示例 1:
输入:nums = [1,2,3,4]输出:[1,3,6,10]
解释:动态和计算过程为[1,1+2,1+2+3,1+2+3+4]。
示例 2:
输入: nums = [1,1,1,1,1]输出:[1,2,3,4,5]
解释:动态和计算过程为[1,1+1,1+1+1,1+1+1+1,1+1+1+1+1]。
示例3:
输入: nums = [3,1,2,10,1]

输出:【3,4,6,16,17]

一、错误代码:

public static yiduishuzudongtaiqiuhe{

    public static void main(String[]args){            int[] nums = {1,2,3,4,5};

        int[] n = runningSum(nums);              System.out.println("结果是"+n);

    }

    public static int[] runningSum(int[] nums) {

        int n = nums.length;

        for(int i = 1;i<n;i++){

           nums[i] = nums[i-1];

        } return nums;

    }

}

二、改正

这段代码存在一些错误,我将指出错误并提供修改后的正确版本。该代码的目的是计算一个整数数组的累计和(running sum),即每个元素是其之前所有元素之和。

错误:

1.在runningSum方法的循环里,累加和赋值有误,应该是nums[i] += nums[i-1];而不是nums[i] = nums[i-1];。

2.输出结果时直接打印数组n会显示数组地址而非内容,应使用Arrays.tostring()方法转换为字符串形式输出。修正后的代码如下:

1 import java.util.Arrays; 复制 

2

3 public class RunningSum { 

public static void main(String[] args){

int[] nums = {1, 2,3,4,5}; int[] n = runningSum(nums);

System.out.println("结果是"+Arrays.toString(n));

8

}

10 public static int[]runningSum(int[] nums) { 

11 int n = nums.length; 

12 for (int i = 1; i< n; i++) { 

13 nums[i] += nums[i - 1]; // 修复累加逻辑 

14 } 

15 return nums; 

16 } 

17}

 

现在这段代码可以正确地计算输入数组{1.2.3.4.5}的累计和,并输出结果为[1.3,6,10.15]。

三、该代码运行的逻辑和原理

修正后的代码逻辑及原理如下:

主要逻辑

1.主方法 (main 方法):这是程序的入口点。首先定义了一个名为nums的整型数组,包含了数字{1,2,3,4,5}。然后调用了runningSum方法来计算这个数组的累计和,并将结果存储在变量n中。最后,使用 Arrays.tostring()方法将数组转换成易于阅读的字符串形式,并打印出结果。

2.累计和计算方法(runningSum方法):此方法接收一个整型数组nums作为参数,目的是计算每个元素的累计和。方法内部首先获取数组长度n。接下来,通过一个for循环从第二个元素(索引为1)开始遍历数组。对于数组中的每个元素,它都将当前元素与其前一个元素的和替换为其自身值,这样逐步累积形成累计和数组。循环结束后,返回这个累计和数组。

原理

累计和(Running Sum)是一个常见的数组操作,它通过迭代数组中的每个元素,对每个元素执行累积操作(通常是求和),从而生成一个新的数组,其中每个位置的值都是原数组到当前位置的所有元素之和。

以数组{1,2,3,4,5}为例,计算过程如下:

初始时,数组保持不变:[1,2,3,4,5]

第一次迭代(索引1):nums[1] = nums[0] + nums[1] = 1 +2 = 3,数组变为:[1,3,3,4,5]第二次迭代(索引2): nums[2] = nums[1] + nums[2]= 3 +3= 6,数组变为:[1,3,6,4,5]依此类推,直至数组末尾。

最终得到累计和数组:[1,3,6,10,15],即每个位置上的数是其之前所有数的和。

四、用自然语言描述该算法的过程

 

这个算法的目的是计算一个整数数组中每个元素的累计和,步骤如下:

1.初始化:我们从一个给定的整数数组开始,比如数组{1,2,3,4,5}。

2.遍历数组:算法从数组的第二个元素(索引为1)开始,逐个检查每个元素,直到数组末尾。

3.累加计算:对于数组中的每个元素,我们执行以下操作:

1.当我们处理到数组中的第i个位置时(从1开始计数),我们会查看它前面的那个元素(即第i-1位)。

2.然后,我们将当前位置的值与前一个位置的值相加,用这个和去更新当前位置的值。这样做就确保了当前位置的值始终是它之前所有位置值的总和。

4.具体实例:

1.初始时: [1,2,3,4,5]

2.第一步:当处理到第二个元素时,计算1(第一个元素的值)+2(第二个元素原始值)=3,数组变为[1,3,3, 4,5]。

3.第二步:处理第三个元素,计算3(第二个元素的新值,即累计和)+3=6,数组变为[1, 3,6,4,5]。

4.以此类推,直到数组最后一个元素。

5.输出结果: 经过上述步骤后,数组的每个元素都变成了它之前所有元素的和,最终得到的累计和数组为[1,3,6,10,15]。

6.展示结果:最后,程序会使用Arrays.tostring()方法将这个累计和数组转换成字符串形式,便于人类阅读,然后打印出来,如输出“结果是[1,3,6,10,15]"。

整个算法通过简单的线性遍历实现了数组元素的累计和计算,是一种直接且高效的方法。

五、分析该算法的时间复杂度和空间复杂度

时间复杂度分析
这个算法的主要操作是遍历输入数组并更新每个元素的值。对于数组中的每一个元素(除了第一个,因为它不需要改变),算法都要执行一次加法操作。因此,如果数组有n个元素,算法需要执行n-1次加法操作。
由于每个操作都是基本的算术运算,我们可以认为每个操作的时间复杂度为0(1)。因此,整个算法的时间复杂度与数组的长度成正比,即O(n),其中n是数组的长度。这意味着算法的执行时间随着输入数据量的增长而线性增长。
空间复杂度分析
空间复杂度衡量的是算法在运行过程中额外占用的内存空间。在这个算法中,我们并没有使用任何与输入数组大小直接相关的额外存储空间。虽然有局部变量n和循环变量i,但这些变量的空间需求是固定的,不随输入数组大小变化。此外,计算过程直接在原数组上进行,没有创建新的数组来存储累计和。
因此,该算法的空间复杂度为0(1),表明它使用的额外空间是常数级别的,不会随着输入数组规模的增大而增加。这是一种非常高效的内存使用方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值